Django中的空查询集

Eri*_*rik 9 django

我在Django中有一个ListView,其get_queryset()方法有时需要不返回任何结果.我尝试了三种方法:

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

其中每一个都返回一个略有不同的对象.

  1. django.db.models.query.EmptyQuerySet 将其model属性设置为 None
  2. django.db.models.query.EmptyQuerySet 将其model属性设置为 Model
  3. django.db.models.query.QuerySet 将其model属性设置为 Model

只有第三个选项适用于基于类的ListView.当ListView尝试访问模型属性时,其他选项会在属性错误时崩溃.这让我感到惊讶并且是一种痛苦,因为它需要我在可能导致MRO问题的地方导入模型.

我做错了什么/我应该做些什么?

更新:问题是,通过类视图方法返回空查询集的正确方法是什么get_queryset()

更新:这是Django的通用视图中的行,在尝试访问model属性时遇到属性错误:https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py #L166.

Har*_*rel 20

我想做到这一点的最好办法是调用none()objects对你们各自的模型,并返回结果.假设您的模型命名为Entry:

queryset = Entry.objects.none()
Run Code Online (Sandbox Code Playgroud)

  • @SebastianGaweda“调用 none() 将创建一个永远不会返回任何对象的查询集,并且在访问结果时不会执行任何查询。” 因为它很快,因为它没有到达数据库 (5认同)
  • 与作者询问的其他方法相比,为什么这是首选方法? (4认同)