【问题标题】:Django order_by on a nested json field嵌套 json 字段上的 Django order_by
【发布时间】:2017-11-24 19:01:14
【问题描述】:

我的模型是这样的。

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

我不知道如何导航到该特定类然后执行查询。最好的方法是什么?

【问题讨论】:

    标签: python sql json django django-queryset


    【解决方案1】:

    如果使用 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",))) 
    

    它必须有效。

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 2017-06-09
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2015-10-25
      • 2012-10-09
      相关资源
      最近更新 更多