Оптимизация запросов django, чтобы избежать дублирования при использовании подробного представления и переопределении get_context_data - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь уменьшить количество дублированных запросов при использовании 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 вообще?

1 Ответ

1 голос
/ 13 марта 2019

В DetailView метод get() устанавливает 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
...