在尝试使用DetailView
之类的CBV时,我试图减少重复查询的数量,然后覆盖get_context_data
以基于相关模型过滤模型。
现在,我有一个DetailView
模型的PatientCase
,并想在一个相关模型CasePhotos
的上下文中创建两个变量,这种关系是通过{ {1}}模型。
CasePhoto
现在,我知道这很不好,但是我似乎找不到正确的最佳方法。我显然在某些地方忽略了一些指导甚至是一些文档链接会更好。
class CasePhoto(models.Model):
...
patient_case = models.ForeignKey(PatientCase, on_delete=models.CASCADE)
photo = models.URLField()
is_mentor_edit = models.BooleanField(default=False)
...
我知道重复项是第5行class ReviewCaseView(DetailView):
model = PatientCase
def get_context_data(self, **kwargs):
patient_case = self.get_object()
context = super().get_context_data(**kwargs)
case_photos = CasePhoto.objects.filter(patient_case=patient_case)
context['case_photos'] = case_photos.filter(is_mentor_edit=False)
context['mentor_photos'] = case_photos.filter(is_mentor_edit=True)
return context
,因为patient_case = self.get_object()
调用detail.py
会创建第一个查询。有没有一种缓存方法可以在get_object
中重用,或者根本没有get_context_data
的更好方法?
答案 0 :(得分:1)
在DetailView
中,get()
method在调用self.object = get_object()
之前设置了get_context_data
,因此您不必再次调用get_object()
。
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
patient_case = self.object
case_photos = CasePhoto.objects.filter(patient_case=patient_case)
context['case_photos'] = case_photos.filter(is_mentor_edit=False)
context['mentor_photos'] = case_photos.filter(is_mentor_edit=True)
return context