django 1.8 - 'NoneType'对象没有属性'aggregate'

时间:2015-11-13 08:14:31

标签: python django

错误是自我清晰的。但我对如何解决它感到困惑。

如果表单条目在数据库中获得相应的记录,则没有错误。但是如果我在数据库中没有相应数据的表单中输入某些内容,那么“NoneType”对象的错误就会显示没有属性“aggregate”。我知道原因是因为没有查询结果,因此在def上下文中它无法继续计算。

因此,如果无论如何都没有在数据库中找到相应的记录,那么它将不会继续在“def get_context_data”中进行计算以避免此错误?因此,页面将保留在当前数据输入页面上,而不会重定向到另一页面以显示结果。

任何建议都表示赞赏,提前谢谢。

views.py

from django.contrib import messages

class FinalView(ListView):
    context_object_name = 'XXX'
    template_name = 'XXX.html'
    model = Final

    def get_queryset(self):
        form = InputForm(self.request.GET)        
        if form.is_valid():
            department = form.cleaned_data['department']
            person = form.cleaned_data['person']

            if department !="" and person !="":
                if Final.objects.filter(department=department,person=person).exists():
                    queryset=Final.objects.filter(department=department,person=person)
                    return queryset
                else:
                    form.add_error(ValidationError('No corresponding data exists'))

            elif department =="" and person !="":
                if Final.objects.filter(person=person).exists():
                    queryset=Final.objects.filter(person=person)
                    return queryset
                else:
                    form.add_error(ValidationError('No corresponding data exists'))

            elif ........


        else:     #if form not valid
            messages.error(request, "Error")

    def get_context_data(self,**kwargs):
        context["sales"] = self.get_queryset().aggregate(Sum('sales'))

按建议编辑

.........Before are the same....

 def get_context_data(self,**kwargs):
        query_set = self.get_queryset()
        if query_set is not None:
            context = super(FinalView, self).get_context_data(**kwargs)
            context["sales"] = query_set.aggregate(Sum('sales'))
            return context

1 个答案:

答案 0 :(得分:2)

使用django查询集对您有利的事实,它不会进行数据库查询,直到它需要数据,所以只需将其拆分以进行一些验证

query_set = self.get_queryset()
context = super(FinalView, self).get_context_data(**kwargs)
if query_set is not None:
    context['sales'] = query_set.aggregate(Sum('sales'))
return context

您可能还需要确保来自get_queryset的所有路径确实返回了一些内容,以便更轻松地进行此类验证。