Django 역 FK 조회를 올바르게 사용하여 CBV에서 자식 모델의 인스턴스를 표시하는 방법

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

특정 그룹을 위해 만들어진 모든 회사 를 얻으려고합니다 . 그래서 Djnago 의 (및 기타) 값을 템플릿의 목록 으로 얻으려고합니다 . 내 CBV는 다음과 같습니다.company_idUpdateView

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.

답변

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()