优化Django查询以避免在使用详细视图和重写get_context_d时出现重复数据

2024-06-16 11:47:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在使用cbv(如DetailView)时减少重复查询的数量,然后重写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的缓存方法更好


Tags: 模型selfdatagetismodelscontextedit
1条回答
网友
1楼 · 发布于 2024-06-16 11:47:56

DetailView中,^{} 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

相关问题 更多 >