簡體   English   中英

Django order_by在嵌套的json字段上

[英]Django order_by on a nested json field

我的模特是這樣的。

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",))) 

它必須工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM