2013-04-28 98 views
2

我在Django中有一个ListView,它的get_queryset()方法有时需要返回没有结果。我已经试过三种方式来做到这一点:Django中的空查询集

  1. return EmptyQuerySet()
  2. return Model.objects.none()
  3. return Model.objects.filter(pk=-1)

这些收益中的每一个稍有不同的对象。

  1. django.db.models.query.EmptyQuerySet设置为None
  2. django.db.models.query.EmptyQuerySet其模型的模型属性属性设置为Model
  3. 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

+0

为什么你不能使用第二个选项,'EmptyQuerySet'在这种情况下,一个模型属性。 – 2013-04-28 05:35:01

+0

只要考虑一下,如果你需要在列表视图中有一个空的查询集,那么我认为你已经得到了错误的逻辑设置。你应该能够处理,而不会崩溃或如此。 – 2013-04-28 06:08:55

+0

@akshar:你会想,但Django仍然在这一行中引发一个Attribute错误:https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166 – Erik 2013-04-28 15:31:58

回答

2

我认为最好的方法是让objectsnone()为你的模型,并返回结果。假设你的模型被命名为Entry

queryset = Entry.objects.none()