CreateView中的重复查询

时间:2015-05-28 04:37:40

标签: django django-generic-views create-view

我有一个与两个查询集相关的CreateView,但为了我的课程,我重复了这些查询。

我试过了:

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, }

但它没有用。我收到了这个错误:

  

/ metas / 4 / add的NameError   姓名' self'未定义

为了我的班级作品,我写了这个:

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, }

如何避免重复查询?

2 个答案:

答案 0 :(得分:1)

重复查询可以是python属性:

@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)

答案 1 :(得分:0)

谢谢@lukkol

另外,我删除了get_initial()只保留一个函数,所以这就是现在的类:

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

    @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)

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