Как оптимизировать Django FormView для производительности базы данных - PullRequest
0 голосов
/ 03 июня 2018

Я никогда не оптимизировал свой код Django, и я не уверен, что полностью понимаю Документы по оптимизации Django , поэтому вы можете сказать мне, можно ли каким-то образом оптимизировать этот класс FormView (я предполагаю, что да ...)?

Часть кода, о которой я беспокоюсь, это поиск пациента: Patient.objects.get(patientId=self.kwargs['patientId']) - это происходит 3 раза ... Означает ли это Django попадет в базу данных 3 раза или только один раз?

Можно / нужно ли это оптимизировать, и если да - как?

class PatientNotes(SingleObjectMixin, FormView):

    slug_url_kwarg = 'patientId'
    slug_field = 'patientId'
    pk_url_kwarg = 'patientId'

    template_name = "patient/patient_detail.html"
    form_class = AddNewNoteForm

    def get_queryset(self):
        queryset = super(PatientNotes, self).get_queryset()
        self.current_patient = Patient.objects.get(patientId=self.kwargs['patientId'])
        my_result = queryset.filter(patient=self.current_patient)
        return my_result

    def post(self, request, *args, **kwargs):
        self.object = Patient.objects.get(patientId=self.kwargs['patientId'])
        return super().post(request, *args, **kwargs)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.patient = Patient.objects.get(patientId=self.kwargs['patientId'])
        self.object.note_created_by_date = datetime.date.today()
        self.object.save()
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('PatientDetailView', kwargs={'patientId': self.object.patient.patientId})

1 Ответ

0 голосов
/ 03 июня 2018

Это означает, что ваше представление содержит дублированные запросы, которые будут попадать в базу данных несколько раз.

Использование

class PatientNotes(SingleObjectMixin, FormView):
    ...

    def get_queryset(self):
        ...
        # This will hit the database to fetch patient object.
        self.current_patient = Patient.objects.get(patientId=self.kwargs['patientId'])
        ...

    def post(self, request, *args, **kwargs):
        # This will also hit the database to fetch patient object.
        self.object = Patient.objects.get(patientId=self.kwargs['patientId'])
        ...

    def form_valid(self, form):
        ...
        # This will also hit the database to fetch patient object.
        self.object.patient = Patient.objects.get(patientId=self.kwargs['patientId'])
        ...

Это считается дублирующими запросами, выполненными во время одного запроса.

Чтобы исправить это, рассмотрите возможность обновления методов get и post, задающих текущий объект равным None для запроса get в тех случаях, когда FormView не требует обновления существующего объекта, который установлен методом postтекущий объект после сохранения формы.

Я бы рекомендовал использовать UpdateView или CreateView , поскольку вы пытаетесь установить self.object, то есть текущий объект, поскольку FormView предназначены для обработки формт.е. только проверка и сохранение данных формы.

Поле модели не должно быть в верблюжьем корпусе Patient.patientId должно быть Patient.patient_id, оно должно быть в нижнем регистре, отделенном подчеркиванием.

class PatientNotes(SingleObjectMixin, FormView):
    model = Patient
    slug_url_kwarg = 'patient_id'
    slug_field = 'patient_id'
    pk_url_kwarg = 'patient_id'
    template_name = 'patient/patient_detail.html'
    form_class = AddNewNoteForm

    def get(self, request, *args, **kwargs):
        self.patient_object = self.get_object()
        return super().get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.patient_object = self.get_object()
        return super().post(request, *args, **kwargs)

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.patient = self.patient_object
        self.object.note_created_by_date = datetime.date.today()
        self.object.save()
        return super().form_valid(form)

    def get_success_url(self):
        # view names should be lower cased separated by underscores.
        return reverse('patient_detail_view', kwargs={'patient_id': self.patient_object.patient_id})
...