CBV में बच्चे के मॉडल के उदाहरण दिखाने के लिए Django रिवर्स एफके लुकअप का सही तरीके से उपयोग कैसे करें

Nov 28 2020

मेरे पास दो मॉडल हैं, उनमें से एक का क्षेत्र दूसरे को इंगित करता है जैसा कि नीचे दिखाया गया है:

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

जवाब

MahmoudAdel Nov 29 2020 at 07:39

अद्यतन: टिप्पणियों में बताई गई समस्याओं को हल करने के लिए मेरे स्थानीय एनवी पर परीक्षण के बाद, यह अंतिम उत्तर है

आपको ओवरराइड करना चाहिए 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()