Cara menggunakan dengan benar pencarian Django reverse FK untuk memperlihatkan contoh model anak di CBV

Nov 28 2020

Saya punya dua model, bidang salah satunya mengarah ke yang lain seperti yang ditunjukkan di bawah ini:

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", ...)

Saya mencoba mendapatkan semua Perusahaan yang telah dibuat untuk Grup tertentu . Jadi saya mencoba mendapatkan nilai company_id(dan lainnya) di Djnago UpdateViewsebagai daftar di templat. CBV saya seperti yang ditunjukkan:

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.

Bisakah seseorang memberi tahu saya cara membuat ini bekerja?

Memperbarui

Seperti yang dijelaskan (@Mahmoud Adel), saya telah memodifikasi saya UpdateViewseperti yang ditunjukkan di bawah ini:

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'])

Dan kemudian di template, saya melakukan:

{{ group.related_grp_company }}

Dengan ini saya mendapatkan hasil <app>.Company.None.

Jawaban

MahmoudAdel Nov 29 2020 at 07:39

UPDATE: Setelah menguji env lokal saya untuk menyelesaikan masalah yang dilaporkan di komentar, ini adalah jawaban akhir

Anda harus mengganti 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

Perhatikan bahwa masalah urutan di sini dalam kueri di atas, melakukan prefetch_relatedsebelum getmemperbaiki kesalahan untuk 'Group' object has no attribute 'prefetch_related'.

Selain itu, Anda dapat berhenti menggunakan prefetch_relateddan hanya melakukan getdari kueri di atas dan itu akan berfungsi juga, tetapi penggunaan prefetch_relateddisarankan untuk mengoptimalkan kinerja karena Anda akan mengambil perusahaan terkait setiap saat

Kemudian di Anda, templateAnda cukup memanggil related_grp_company.alldari objek, katakanlah Anda meneruskan Groupobjek saat ini groupke templat Anda, jadi seharusnya seperti group.related_grp_company.all, ini adalah QuerySetdaftar, jadi putar ulang atau lakukan apa pun yang Anda inginkan.

misalnya:

{%for d in object.related_grp_company.all%}
<h1>{{ d.company_id }}</h1>
{% endfor %}

Karena kami tidak menambahkan allkami mendapatkan <app>.Company.Nonelebih awal

Tip:

related_namedigunakan untuk hubungan terbalik , saya akan menyarankan untuk mengganti namanya companiesmenjadi lebih jelas, misalnya:

group_company = models.ForeignKey(Group, related_name="companies", ...)

jadi menggunakannya nanti akan seperti group.companies()