【问题标题】:Empty querysets in DjangoDjango 中的空查询集
【发布时间】:2013-04-22 00:16:36
【问题描述】:

我在 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 其模型属性设置为 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

【问题讨论】:

  • 为什么不能使用第二个选项,EmptyQuerySet在那种情况下有一个模型属性。
  • 如果您需要在列表视图中有一个空的查询集,只要考虑一下,我就会认为您的逻辑设置错误。你应该能够在没有崩溃的情况下处理它。
  • @akshar:你会想,但是 Django 仍然在这一行抛出一个属性错误:github.com/django/django/blob/stable/1.5.x/django/views/generic/…
  • @limelights:拥有 0 个项目的列表视图是一个完全合理的结果。例如,客户 x 有 0 个订单。
  • 当然,但这不应该是一个空的查询集。它应该由模板处理。

标签: django


【解决方案1】:

我认为完成此操作的最佳方法是为您各自的模型在objects 上调用none(),并返回结果。假设您的模型名为Entry

queryset = Entry.objects.none()

【讨论】:

  • 与作者询问的其他方法相比,为什么这是首选方法?
  • @SebastianGaweda “调用 none() 将创建一个从不返回任何对象的查询集,并且在访问结果时不会执行任何查询。”因为它的速度很快,因为它没有击中数据库
猜你喜欢
  • 2012-04-14
  • 2010-11-26
  • 1970-01-01
  • 2018-12-01
  • 2013-06-30
  • 1970-01-01
  • 2020-10-08
  • 2014-08-28
  • 2021-11-30
相关资源
最近更新 更多