2017-06-21 21 views
5

मेरे मॉडल इस तरह कुछ हैं।एक नेस्टेड जेसन क्षेत्र पर Django order_by

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 

दूसरा बयान काम नहीं करता है की कोशिश की है है। मुझे का उपयोग Django 1.9 JSONField order_by

मैं समझ नहीं सकता कि उस विशेष वर्ग पर नेविगेट कैसे करें और फिर क्वेरी निष्पादित करें। इसे करने का बेहतरीन तरीका क्या है?

उत्तर

0

यदि आप RawSQL दर्ज सामग्री का उपयोग करते हैं तो SQL क्वेरी होना चाहिए। दर्ज क्वेरी केवल फू मॉडल ऑब्जेक्ट्स का चयन करें।

पहले आपको संबंधित मॉडल सामग्री का चयन करना होगा।

foo = Foo.objects.select_related("bar__candy") 
अजगर खोल में

अगर आप

print foo.query 

दर्ज आप देख सकते हैं डेटाबेस क्वेरी में प्रवेश किया और सभी क्षेत्रों के नाम

आपके द्वारा चयनित में प्रवेश किया फ़ील्ड नाम के साथ RawSQL दर्ज करना होगा के बाद।

यदि आप क्वेरी में देखने के सभी क्षेत्रों के नाम प्रारूप

"<table name>"."<field name>" 

में हैं कि आपके ऐप नाम मुख्य डेटाबेस में अपने कैंडी तालिका नाम main_candy है ताकि आप में प्रवेश कर सकते RawSQL है:

foo = foo.order_by(RawSQL("main_candy.payload->>%s", ("names[0].text",))) 

और इसे काम करना चाहिए।

संबंधित मुद्दे