Django,JSONField,Postgres和F()对象比较

Don*_*nti 7 python django postgresql

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

class Event(models.Model):
    data = JSONField(default=None)
Run Code Online (Sandbox Code Playgroud)

我们假设数据字段看起来像这样:

{  
   "value_1":20,
   "value_2":25
}
Run Code Online (Sandbox Code Playgroud)

我希望像这样查询它:

events = Event.objects.filter(data__value_2__gte=F('data__value_1'))
Run Code Online (Sandbox Code Playgroud)

但是,错误是这样的:

Cannot resolve keyword 'value_1' into field. Join on 'data' not permitted.
Run Code Online (Sandbox Code Playgroud)

也尝试过:

events = Event.objects.filter(data__value_2__gte=F('data')['value_1'])
Run Code Online (Sandbox Code Playgroud)

但是给出了错误:

TypeError: 'F' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

也; Django 1.10,Python 2.7.11,PG版本:9.4.9

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

fal*_*der 4

看起来,可以说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")
Run Code Online (Sandbox Code Playgroud)

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

SELECT "test_event"."id", "test_event"."data" FROM "test_event" WHERE "test_event"."data" -> 'value_1' >= "test_event"."data" -> 'value_2'
Run Code Online (Sandbox Code Playgroud)

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