Cara menggunakan dengan benar pencarian Django reverse FK untuk memperlihatkan contoh model anak di CBV
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 UpdateView
sebagai 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 UpdateView
seperti 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
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_related
sebelum get
memperbaiki kesalahan untuk 'Group' object has no attribute 'prefetch_related'
.
Selain itu, Anda dapat berhenti menggunakan prefetch_related
dan hanya melakukan get
dari kueri di atas dan itu akan berfungsi juga, tetapi penggunaan prefetch_related
disarankan untuk mengoptimalkan kinerja karena Anda akan mengambil perusahaan terkait setiap saat
Kemudian di Anda, template
Anda cukup memanggil related_grp_company.all
dari objek, katakanlah Anda meneruskan Group
objek saat ini group
ke templat Anda, jadi seharusnya seperti group.related_grp_company.all
, ini adalah QuerySet
daftar, 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 all
kami mendapatkan <app>.Company.None
lebih awal
Tip:
related_name
digunakan untuk hubungan terbalik , saya akan menyarankan untuk mengganti namanya companies
menjadi lebih jelas, misalnya:
group_company = models.ForeignKey(Group, related_name="companies", ...)
jadi menggunakannya nanti akan seperti group.companies()