我的模型是这样的。
class Foo():
bar = models.ForeignKey('Bar', related_name='bar')
payload = JSONField()
class Bar():
candy = models.ForeignKey('Candy', related_name='candy')
class Candy():
payload = JSONField()
我的查询集看起来像这样
# I want to order by a name on the json field
queryset = [
{
"id": 1,
"payload": {"age": 10, "company": "ccc"}
"bar":
{
'id': 1,
"candy":
{
"payload":
{
"names": ["text":"abc", "tag":"foo"], ["text":"abb", "tag":"bar"]
}
}
}
},
{
"id": 2,
"payload": {"age": 12, "company": "aa"}
"bar":
{
'id': 2,
"candy":
{
"payload":
{
"names": ["text":"aaa", "tag":"bar"], ["text":"bbb", "tag":"bart"]
}
}
}
}]
foo = Foo.objects.all() #now I want to order foo by "names.text"
这是我目前的尝试
foo = foo.order_by(RawSQL("payload->>%s", ("age",))) #this works!!
foo = foo.order_by(RawSQL("bar.candy.payload->>%s", ("names[0].text",))) #does not work
第二个语句不起作用。我从这里得到了使用 RawSQL
的灵感
Django 1.9 JSONField order_by
我不知道如何导航到那个特定的类然后执行查询。执行此操作的最佳方法是什么?
最佳答案
如果使用RawSQL,输入的内容必须是sql查询。输入的查询仅选择 Foo 模型对象。
首先您必须选择相关模型内容。
foo = Foo.objects.select_related("bar__candy")
在 python shell 中如果你输入
print foo.query
您可以看到输入的数据库查询和所有字段名称
之后,您必须输入 RawSQL 并选择输入的字段名称。
如果您在查询中看到所有字段名称都是格式
"<table name>"."<field name>"
如果您的应用名称是Main,您在数据库中的糖果表名称是main_candy,因此您可以输入RawSQL:
foo = foo.order_by(RawSQL("main_candy.payload->>%s", ("names[0].text",)))
而且它必须有效。
关于python - 嵌套的 json 字段上的 Django order_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44683464/