【问题标题】:django 1.8 - 'NoneType' object has no attribute 'aggregate'django 1.8 - “NoneType”对象没有属性“聚合”
【发布时间】:2015-11-13 08:14:30
【问题描述】:

错误是不言自明的。但我对如何解决它感到困惑。

如果表单条目在数据库中获得了相应的记录,则没有错误。但是如果我在表格中输入了一些在数据库中没有相应数据的内容,那么就会出现“NoneType”对象没有“聚合”属性的错误。我知道原因是因为没有查询结果,所以在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

【问题讨论】:

    标签: python django


    【解决方案1】:

    利用 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 的所有路径都确实返回了一些内容,以使这种验证更容易。

    【讨论】:

    • 谢谢。修改后出现“赋值前引用局部变量'context'”的错误,我会按照你的建议更新代码。
    • @Elena - 我已经更新,包括你应该在哪里调用 super,不管查询集是什么,你可能仍然想调用 super
    • 谢谢。如果def get_queryset(self)中的“form.add_error(ValidationError('No对应的数据存在'))”有什么冲突,因为我想显示错误信息,但是现在是查询为空的时候,还是不行'不显示此错误。
    • @Elena - 这是一个不同的问题,部分原因是当您退出方法时您的表单超出范围,但部分原因是这不是 get_querysets 要做的工作,所有获取查询集都应该做就是“它在锡上说的”(获取查询集)。
    • 谢谢。我想我又回到了你 1 周前帮助过的问题,但是我仍然没有解决那个问题,在找不到记录时在表单输入页面上显示错误消息。 stackoverflow.com/questions/33494689/…。我怎样才能只显示这个错误而不重定向到另一个页面?
    猜你喜欢
    • 2015-06-15
    • 2021-08-03
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多