优化 Django 查询以避免在使用详细视图和覆盖时出现重复 get_context_data
Optimising django queries to avoid duplicates when using detail view and overriding get_context_data
我试图在使用 DetailView
等 CBV 时减少重复查询的数量,然后覆盖 get_context_data
以根据相关模型过滤模型。
现在,我有一个 DetailView
用于 PatientCase
模型,并想在相关模型的上下文中创建两个变量 CasePhotos
关系是通过外键CasePhoto
模型。
class CasePhoto(models.Model):
...
patient_case = models.ForeignKey(PatientCase, on_delete=models.CASCADE)
photo = models.URLField()
is_mentor_edit = models.BooleanField(default=False)
...
现在,我知道这很糟糕,但我似乎找不到正确的最佳方法来执行此操作。一些指导甚至更好的一些我在某处明显忽略的文档链接会更好。
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
我知道重复项是第 5 行 patient_case = self.get_object()
,因为 detail.py
调用 get_object
,这是创建第一个查询的原因。有没有一种方法可以缓存它以便在 get_context_data
中重用或者根本没有 get_context_data
的更好方法?
在DetailView
中,get()
method在调用get_context_data
之前设置self.object = get_object()
,因此您不必再次调用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
我试图在使用 DetailView
等 CBV 时减少重复查询的数量,然后覆盖 get_context_data
以根据相关模型过滤模型。
现在,我有一个 DetailView
用于 PatientCase
模型,并想在相关模型的上下文中创建两个变量 CasePhotos
关系是通过外键CasePhoto
模型。
class CasePhoto(models.Model):
...
patient_case = models.ForeignKey(PatientCase, on_delete=models.CASCADE)
photo = models.URLField()
is_mentor_edit = models.BooleanField(default=False)
...
现在,我知道这很糟糕,但我似乎找不到正确的最佳方法来执行此操作。一些指导甚至更好的一些我在某处明显忽略的文档链接会更好。
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
我知道重复项是第 5 行 patient_case = self.get_object()
,因为 detail.py
调用 get_object
,这是创建第一个查询的原因。有没有一种方法可以缓存它以便在 get_context_data
中重用或者根本没有 get_context_data
的更好方法?
在DetailView
中,get()
method在调用get_context_data
之前设置self.object = get_object()
,因此您不必再次调用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