【问题标题】:Duplicated queries in CreateViewCreateView 中的重复查询
【发布时间】:2015-08-10 10:03:15
【问题描述】:

我有一个包含两个相关查询集的 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 处的名称错误
名称“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, }

如何避免重复查询?

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-01-10
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 2018-06-26
        相关资源
        最近更新 更多