如何正确使用Django反向FK查找来在CBV中显示子模型的实例



我有两个模型,其中一个模型的字段指向另一个,如下所示:

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

我正在尝试获取为特定集团创建的所有公司。因此,我试图将DjnagoUpdateView中的company_id(和其他(值作为模板中的列表。我的CBV如图所示:

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.

有人能告诉我如何让它发挥作用吗

更新

正如所解释的(@Mahmoud Adel(,我修改了我的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的输出。

更新:在我的本地env上测试以解决评论中报告的问题后,这是最终的答案

您应该覆盖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

注意,在上面的查询中,顺序很重要,在get之前执行prefetch_related可以修复'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()

最新更新