我希望通过比较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的比较进行过滤吗?
答案 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'
。