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

时间:2016-11-16 03:57:27

标签: python django postgresql

我希望通过比较JSONField类中的两个值来创建Django查询。我在模型上的参考字段中遇到了Django F()对象,但它似乎不适用于JSONField,因为它尝试使用后面的部分进行from kivy.app import App from kivy.uix.widget import Widget from kivy.graphics import Color, Ellipse, Line class YellowDot(Widget): def draw(self): with self.canvas: Color(1,1,0) Ellipse(pos=(500, 500), size=(50,50)) class TestApp(App): def build(self): game=YellowDot() game.draw() return game if __name__ == '__main__': TestApp().run() 。所以,例如:

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'])

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

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

1 个答案:

答案 0 :(得分:3)

它的外观,可以说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'