【问题标题】:Json Fields search with django unexpected behavior使用 django 意外行为进行 Json 字段搜索
【发布时间】:2018-07-13 14:41:35
【问题描述】:

大家好,我在 django postgres json 搜索中看到了我不理解的行为。 我正在使用 django 1.11 和 django orm 和 psycopg2 驱动程序。

如下:

model字段中的json长这样。

{"2018": [1, 2, 3]}

如果我使用这个查询:

models.mymodel.objects.filter(jsonfield__2018__contains=1)
Out[97]: <QuerySet []>

所以你可以看到我得到一个空查询。

然后我尝试这样做只是为了测试目的。 新 Json:

[ {"2018": [1, 2, 3]}]

新查询:

models.mymodel.objects.filter(jsonfield__0__2018__contains=1)
Out[98]: <QuerySet []>

它仍然没有给我任何回应。

然后我终于尝试了这个。 新 Json:

[ {"2018_1": [1, 2, 3]}]

新查询:

models.mymodel.objects.filter(jsonfield__0__2018_1__contains=1)
Out[100]: <QuerySet [<MyModel: MyModel object>]>

这个回复了,我无法理解它。有谁知道这是为什么?

【问题讨论】:

  • 你能试试这个吗.. {"abc": [1, 2, 3]} .. models.mymodel.objects.filter(jsonfield__abc__contains=1) .. 如果可行,那么我们知道问题。 Django 不允许数字作为模型字段名称。
  • 老兄,谢谢你,很好地抓住了它

标签: python sql django postgresql orm


【解决方案1】:

Django 不允许模型中只有数字的字段名称。我认为这种限制来自于一些数据库列名限制(例如,在 MySQL 中,标识符可能以数字开头,但除非引用可能不完全由数字组成)。

而且 Django 对 JSON 键有类似字段的行为,所以我认为问题可能是由于相同的原因。您可以尝试使用字母数字 JSON 密钥并对其进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2013-09-23
    • 2021-01-24
    • 2017-11-09
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多