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的比较进行过滤吗?
看起来,可以说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'表达式的格式。
| 归档时间: |
|
| 查看次数: |
1094 次 |
| 最近记录: |