【发布时间】:2013-04-22 00:16:36
【问题描述】:
我在 Django 中有一个 ListView,它的 get_queryset() 方法有时需要不返回任何结果。我尝试了三种方法来做到这一点:
return EmptyQuerySet()return Model.objects.none()return Model.objects.filter(pk=-1)
每一个都返回一个略有不同的对象。
-
django.db.models.query.EmptyQuerySet其模型属性设置为None -
django.db.models.query.EmptyQuerySet其模型属性设置为Model -
django.db.models.query.QuerySet其模型属性设置为Model
只有第三个选项适用于基于类的 ListView。当 ListView 尝试访问模型属性时,其他选项会因属性错误而崩溃。这让我很惊讶,也很痛苦,因为它需要我在可能导致 MRO 问题的地方导入模型。
我做错了什么/我应该做些什么不同的事情?
更新:那么问题来了,通过类视图方法get_queryset()返回空查询集的正确方法是什么?
更新:这是 Django 通用视图中尝试访问 model 属性时遇到属性错误的行:https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166。
【问题讨论】:
-
为什么不能使用第二个选项,
EmptyQuerySet在那种情况下有一个模型属性。 -
如果您需要在列表视图中有一个空的查询集,只要考虑一下,我就会认为您的逻辑设置错误。你应该能够在没有崩溃的情况下处理它。
-
@akshar:你会想,但是 Django 仍然在这一行抛出一个属性错误:github.com/django/django/blob/stable/1.5.x/django/views/generic/…
-
@limelights:拥有 0 个项目的列表视图是一个完全合理的结果。例如,客户 x 有 0 个订单。
-
当然,但这不应该是一个空的查询集。它应该由模板处理。
标签: django