Django

10

में select_related का उपयोग करके विशिष्ट फ़ील्ड का चयन करना मेरे पास एक विदेशी कुंजी का उपयोग करके संबंधित दो मॉडल आलेख और ब्लॉग हैं। मैं आलेख निकालने के दौरान केवल ब्लॉग नाम चुनना चाहता हूं।Django

articles = Articles.objects.all().select_related('blog__name') 

उत्पन्न क्वेरी से पता चलता है कि उसने ब्लॉग मॉडल से सभी फ़ील्ड चुने हैं। मैंने select_related के साथ केवल() और defer() का उपयोग करने की कोशिश की लेकिन दोनों काम नहीं कर पाए।

articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time') 

ऊपर क्वेरी त्रुटि हुई: अमान्य फ़ील्ड नाम (रों) select_related में दी गई: विकल्प हैं: ब्लॉग

मैं एक प्रश्न कैसे जेनरेट करूं ताकि केवल लेख के खेतों और ब्लॉग का नाम चयन किया जाता है?

+0

मैं यह संभव है नहीं लगता है - 'only' traversing संबंधों के किसी भी उदाहरण नहीं दिखा के लिये दस्तावेज जबकि' select_related' के लिये दस्तावेज केवल कई संबंधों traversing के उदाहरणों से पता चलता (यानी 'rel__rel', 'rel__field' नहीं)। ऐसा लगता है कि आप सबसे अच्छा कर सकते हैं 'articles = articles.objects.all()। select_related (' blog ')। केवल (' ब्लॉग ',' शीर्षक ',' create_time ') ' – Anentropic

+0

क्या ऐसा करने का उद्देश्य है? प्रदर्शन अनुकूलन? हालांकि, आप इसे 'prefetch_related' का उपयोग करके कर सकते हैं, लेकिन इस तरह आप एक के बजाय 2 प्रश्नों के साथ समाप्त हो जाएंगे। 'Articles.objects.all()। Prefetch_related (प्रीफेच ('ब्लॉग', क्वेरीसेट = Blog.objects.all()। केवल ('नाम')))' – Todor

+0

एकमात्र उद्देश्य प्रदर्शन को अनुकूलित करना था। मैं पहले से ही select_related का उपयोग कर रहा हूं, लेकिन यह उन सभी विशेषताओं को देता है जो बहुत सारी मेमोरी का उपभोग करते हैं। ऐसा करने के लिए कोई और रास्ता नहीं है? – RA123

उत्तर

8

आप इसके लिए annotate() का उपयोग कर सकते हैं।

>>> a = Articles.objects.annotate(blog_name=F('blog__name')).first() 
>>> a.title 
>>> a.blog_name 
5

select_related पूरे मॉडल पर उपयोग किया जाना चाहिए, और फिर आप इसे और अधिक फ़िल्टर कर सकते हैं। यह काम करेगा:

Articles.objects.select_related('blog').only('blog__name', 'title', 'create_time') 
+1

का उपयोग करना .values ​​क्वेरीसेट ऑब्जेक्ट के बजाय शब्दकोश देता है, जो टेम्पलेट्स या दृश्य में 'file.url' या 'file.name' जैसे संबंधों का उपयोग करने के लिए बेकार बनाता है। क्या कोई अन्य तरीका संभव है? – RA123

+0

@ आरए 123 मैंने अपना जवाब संपादित किया। कोशिश की और इस तरह यह मेरे लिए काम करता है –

+0

यह भी काम नहीं कर रहा है। मैं Django 1.8 पर हूँ। यह निम्न त्रुटि देता है - "select_related: 'ब्लॉग' में दिए गए अमान्य फ़ील्ड नाम। विकल्प हैं: ब्लॉग" जब मैं 'केवल' में 'blog__name' से '__name' को हटाता हूं, तो यह ठीक काम करता है लेकिन सभी फ़ील्ड प्राप्त करता है। – RA123