【问题标题】:Django, JSONField, Postgres, and F() object comparisonDjango、JSONField、Postgres 和 F() 对象比较
【发布时间】:2017-03-30 03:51:30
【问题描述】:

我希望通过比较 JSONField 类中的两个值来进行 Django 查询。我遇到了模型上的引用字段的 Django F() 对象,但它似乎不适用于 JSONField,因为它试图在后面的部分执行 JOIN。所以,例如:

class Event(models.Model):
    data = JSONField(default=None)

假设数据字段如下所示:

{  
   "value_1":20,
   "value_2":25
}

我希望这样查询它:

events = Event.objects.filter(data__value_2__gte=F('data__value_1'))

但是,错误是这样的:

Cannot resolve keyword 'value_1' into field. Join on 'data' not permitted.

也试过了:

events = Event.objects.filter(data__value_2__gte=F('data')['value_1'])

但我给出了错误:

TypeError: 'F' object has no attribute '__getitem__'

还有; Django 1.10,Python 2.7.11,PG 版本:9.4.9

知道如何根据 value_1 和 value_2 的比较进行过滤吗?

【问题讨论】:

  • 这只是一个猜测,但请尝试data__value_2__gte=F('data')['value_1']
  • 没用:TypeError: 'F' object has no attribute 'getitem'
  • Django 1.10,Python 2.7.11
  • 还有postgres版本,请
  • 你试过用annotate来代替吗?

标签: python django postgresql


【解决方案1】:

看样子,可以说F表达式不支持json字段查找。正如您在下面为下面的 django 查询生成的 sql 查询所看到的那样

print Event.objects.filter(data__value_1=F('data')).query
SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= ("test_event"."data")

为了在 postgres 上工作,查询应该如下:

SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= "test_event"."data" -> 'value_2'

无论您尝试使用 F 表达式,它都不会为表达式生成格式 "test_mymodal"."data" -> 'value_2'

【讨论】:

  • 我最终重新建模了我的数据结构,以便我可以使用 F 对象。无论如何,这似乎是一个正确的解释和解决方法,不过,我还没有测试过。
  • 你尝试过 CAST JSON 字段吗?我成功地进行了注释并对其进行了过滤。它只需要 CAST() 尝试类似于我的答案stackoverflow.com/a/54805003/2848256
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2016-08-13
  • 2013-08-19
  • 1970-01-01
  • 2018-01-14
  • 2017-12-20
  • 1970-01-01
  • 2013-01-01
相关资源
最近更新 更多