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", ...)
특정 그룹을 위해 만들어진 모든 회사 를 얻으려고합니다 . 그래서 Djnago 의 (및 기타) 값을 템플릿의 목록 으로 얻으려고합니다 . 내 CBV는 다음과 같습니다.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.
누군가 이것을 작동시키는 방법을 알려주시겠습니까?
최신 정보
설명 (@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
.
답변
업데이트 : 의견에보고 된 문제를 해결하기 위해 로컬 환경에서 테스트 한 후 이것이 최종 답변입니다.
재정의해야합니다. 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()