python - 嵌套的 json 字段上的 Django order_by

标签 python sql json django django-queryset

我的模型是这样的。

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,您在数据库中的糖果表名称是ma​​in_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/

相关文章:

php - 您如何动态显示用户配置文件?

ios - 努力将 NSArray 解析为带有分隔符的字符串,以快速生成 QR 码

python - 使用协程在 python 中实现责任链模式

python - “No URL to redirect to” 如何重定向到django同一页面

python - 编写此代码时遇到困难,复杂度为 O(N)

MySQL 不等于吗?

python - Django - 无法添加中间件

sql - postgres 中用于计算值的列别名

c# - 如何使用 CreateDocumentAsync 将 json 内容存储到 CosmosDB

java - 使用 Jackson 将 JSON 反序列化为包含集合的 Java 对象