Django:何时使用 QuerySet none()

新手上路,请多包涵

刚刚在 django 文档 中发现了这个

调用 none() 将创建一个从不返回任何对象的查询集,并且在访问结果时不会执行任何查询。 qs.none() 查询集是 EmptyQuerySet 的一个实例。

我构建了很多 CRUD 应用程序(令人惊讶),我想不出我需要使用 none() 的情况。

为什么要返回一个 EmptyQuerySet?

原文由 super9 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 733
2 个回答

通常在您需要提供 QuerySet 的情况下,但没有提供 - 例如调用方法或提供模板。

优点是,如果您 知道 不会有结果(或不想要结果)并且您仍然 需要 一个结果, none() 不会访问数据库。

举一个不现实的例子,假设您有一个 API,您可以在其中查询您的权限。如果帐户尚未确认,因为您已经拥有 Account 对象,您可以看到 account.is_activatedFalse 可以跳过-检查数据库仅使用权限 Permission.objects.none()

原文由 DanielB 发布,翻译遵循 CC BY-SA 3.0 许可协议

在您想要附加到查询集但想要一个空的开始的情况下类似于我们实例化一个空列表开始但逐渐向其添加有意义的值的情况示例..

 def get_me_queryset(conditionA, conditionB, conditionC):
    queryset = Model.objects.none()

    if conditionA:
        queryset |= some_complex_computation(conditionA)
    elif conditionB:
        queryset |= some_complex_computation(conditionB)

    if conditionC:
        queryset |= some_simple_computation(conditionC)

    return queryset

get_me_queryset should almost always return instance of django.db.models.query.QuerySet (because good programming) and not None or [] , or else it will introduce headaches later ..

这样即使没有任何条件出现 True ,您的代码仍将保持完整。不再进行类型检查

对于那些不理解 | 运算符在这里的用法的人:

 queryset |= queryset2

它翻译成:

 queryset = queryset + queryset

原文由 Arpit Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题