优化Django查询,以避免在使用详细信息视图并覆盖get_context_data

时间:2019-03-13 15:39:46

标签: python django python-3.x performance django-class-based-views

在尝试使用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的更好方法?

1 个答案:

答案 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