Search code examples
djangodjango-generic-viewscreate-view

Duplicated queries in CreateView


I have a CreateView with two queryset related, but in order my class works I repeated these queries.

I tried this:

class CrearEvidencia(CreateView):
    from django.shortcuts import get_object_or_404, get_list_or_404
    from core.models import Pipol

    model = Evidencia
    form_class = EvidenciaForm
    template_name_suffix = '_add'

    meta = get_object_or_404(MetasSPE, pk=self.kwargs['pk'])
    pipol = Pipol.objects.filter(puesto=meta.puesto)

    def get_form(self, form_class):
        form = super(CrearEvidencia, self).get_form(form_class)
        form.fields['miembro'].queryset = self.pipol
        return form

    def get_initial(self):
        meta = self.meta
        return {'meta': meta, }

But it didn't work. I got this error:

NameError at /metas/4/add
name 'self' is not defined

In order to my class works, I wrote this:

class CrearEvidencia(CreateView):
    model = Evidencia
    form_class = EvidenciaForm
    template_name_suffix = '_add'

    def get_form(self, form_class):
        from django.shortcuts import get_object_or_404, get_list_or_404
        from core.models import Pipol
        meta = get_object_or_404(MetasSPE, pk=self.kwargs['pk'])
        form = super(CrearEvidencia, self).get_form(form_class)
        form.fields['miembro'].queryset = Pipol.objects.filter(puesto=meta.puesto)
        return form

    def get_initial(self):
        from django.shortcuts import get_object_or_404
        meta = get_object_or_404(MetasSPE, pk=self.kwargs['pk'])
        return {'meta': meta, }

How can I avoid the repeated queries?


Solution

  • Repeated queries can be python properties:

    @property
    def meta(self):
        return get_object_or_404(MetasSPE, pk=self.kwargs['pk'])
    
    @property
    def pipol(self):
        return Pipol.objects.filter(puesto=self.meta.puesto)