CBV में बच्चे के मॉडल के उदाहरण दिखाने के लिए Django रिवर्स एफके लुकअप का सही तरीके से उपयोग कैसे करें
मेरे पास दो मॉडल हैं, उनमें से एक का क्षेत्र दूसरे को इंगित करता है जैसा कि नीचे दिखाया गया है:
class Group(models.Model):
group_company_id = models.CharField(primary_key=True, ...)
class Company(models.Model):
company_id = models.CharField(primary_key=True, ...)
group_company = models.ForeignKey(Group, related_name="related_grp_company", ...)
मैं उन सभी कंपनियों को प्राप्त करने की कोशिश कर रहा हूं जो एक विशेष समूह के लिए बनाई गई हैं । इसलिए मैं टेम्पलेट में एक सूची के रूप company_id
में (और अन्य) मानों को पाने की कोशिश कर रहा हूं UpdateView
। मेरा सीबीवी दिखाया गया है:
class GroupCompanyChangeView(UpdateView):
template_name = ...
model = Group
form_class = ...
success_url = reverse_lazy('group_list')
grp_coy_units = Group.objects.prefetch_related('related_grp_company') # I am trying to get the values of `company_id` in the template but nothing is displayed.
क्या कोई मुझे बता सकता है कि मुझे यह कैसे काम करना है?
अपडेट करें
जैसा कि समझाया गया है (@ महमूद अदेल), मैंने UpdateView
नीचे दिखाए अनुसार अपना संशोधन किया है :
class GroupCompanyChangeView(UpdateView):
template_name = ...
model = Group
form_class = ...
success_url = reverse_lazy('group_list')
def get_object(self, *args, **kwargs):
return Group.objects.get(pk=self.kwargs['pk'])
और फिर टेम्पलेट में, मैं कर रहा हूँ:
{{ group.related_grp_company }}
इससे मुझे आउटपुट मिल रहा है <app>.Company.None
।
जवाब
अद्यतन: टिप्पणियों में बताई गई समस्याओं को हल करने के लिए मेरे स्थानीय एनवी पर परीक्षण के बाद, यह अंतिम उत्तर है
आपको ओवरराइड करना चाहिए get_object()
def get_object(self, *args, **kwargs):
try:
return Group.objects.prefetch_related('related_grp_company').get(pk=self.kwargs['pk'])
except:
return None
ध्यान दें कि उपरोक्त क्वेरी के लिए यहां ऑर्डर करें, त्रुटि को ठीक करने prefetch_related
से पहले ।get
'Group' object has no attribute 'prefetch_related'
इसके अलावा, आप उपयोग prefetch_related
करना छोड़ सकते हैं और केवल get
उपरोक्त क्वेरी से कर सकते हैं और यह भी काम करेगा, लेकिन prefetch_related
प्रदर्शन का अनुकूलन करने का सुझाव दिया जाता है क्योंकि आप संबंधित कंपनियों को हर बार लाएंगे।
तब आप अपने ऑब्जेक्ट से template
बस कॉल कर सकते हैं related_grp_company.all
, मान लें कि आप अपने टेम्पलेट के अनुसार वर्तमान Group
ऑब्जेक्ट को पास कर रहे हैं group
, इसलिए इसे पसंद करना चाहिए group.related_grp_company.all
, यह एक QuerySet
सूची है, इसलिए इस पर लूप करें या जो चाहें करें।
पूर्व के लिए:
{%for d in object.related_grp_company.all%}
<h1>{{ d.company_id }}</h1>
{% endfor %}
क्योंकि हमने नहीं जोड़ा कि all
हम <app>.Company.None
पहले हो रहे थे
सुझाव:
related_name
इसका उपयोग रिवर्स रिलेशन के लिए किया जाता है , मैं इसका नाम बदलने का सुझाव दूंगा, companies
इसलिए यह अधिक स्पष्ट होगा, उदाहरण के लिए:
group_company = models.ForeignKey(Group, related_name="companies", ...)
इसलिए इसका उपयोग करना बाद में पसंद आएगा group.companies()