आप jsonb_extract_path_text का उपयोग कर सकते हैं एक Func के माध्यम से ऑब्जेक्ट फ़ील्ड ट्रांसफ़ॉर्म के विकल्प के रूप में:
Pet.annotate(dinner=Func(
F('data'), Value('diet'), Value('dinner'),
function='jsonb_extract_path_text')) \
.values('dinner') \
.annotate(total=Count('dinner'))
फ़ील्ड बदलने का कारण data__diet__dinner
विफल रहता है Django के भीतर एक त्रुटि है जब आप json संरचना में सिर्फ एक स्तर से अधिक गहराई तक जाते हैं और GROUP BY
. का उपयोग करें एसक्यूएल में। प्रथम स्तर (name
, animal
, diet
) ठीक काम करना चाहिए।
इसका कारण यह प्रतीत होता है कि नेस्टेड ट्रांसफ़ॉर्म के लिए, Django उपयोग किए गए SQL सिंटैक्स को बदलता है, एकल मान से सूची में स्विच करके json संरचना में पथ निर्दिष्ट करता है।
यह गैर-नेस्टेड जोंस ट्रांस्फ़ॉर्म (=प्रथम स्तर) के लिए उपयोग किया जाने वाला सिंटैक्स है:
"appname_pet"."data" -> 'diet'
और यह नेस्टेड ट्रांसफ़ॉर्म (पहले स्तर से गहरा) के लिए उपयोग किया जाने वाला सिंटैक्स है:
"appname_pet"."data" #> ARRAY['diet', 'dinner']
क्वेरी का निर्माण करते समय, आवश्यक GROUP BY
पर काम करते समय Django उस सूची में चोक हो जाता है खंड। यह एक अपरिहार्य प्रतिबंध नहीं लगता है; परिवर्तन के लिए समर्थन काफी नया है, और यह संभवत:उन किंकों में से एक है जिस पर अभी तक काम नहीं किया गया है। इसलिए अगर आप Django टिकट
खोलते हैं , यह लाइन के कुछ ही संस्करणों में काम कर सकता है।