刚刚在django docs
中遇到过这个问题调用none()将创建一个永远不会返回任何对象的查询集 访问结果时不会执行任何查询。一个qs.none() queryset是EmptyQuerySet的一个实例。
我构建了很多CRUD应用程序(惊喜),我想不出我需要使用none()
的情况。
为什么要返回一个EmptyQuerySet?
答案 0 :(得分:20)
通常情况下,您需要提供QuerySet
,但没有提供 - 例如调用方法或提供模板。
优势在于,如果你知道没有结果(或者不想要结果),你仍然需要一个,none()
不会打到数据库。
对于一个不现实的例子,假设您有一个API,您可以在其中查询您的权限。如果帐户尚未确认,因为您已经拥有Account
对象,并且可以看到account.is_activated
为False
,您可以跳过检查数据库的权限,只需使用{{ 1}}
答案 1 :(得分:7)
如果要追加到查询集但希望以空数开头,则需要 类似于我们实例化一个空列表开始但逐渐向其添加有意义值的条件 例如..
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应该几乎总是返回django.db.models.query.QuerySet的实例(因为编程好)而不是None或[],否则以后会引入头痛......
这种方式即使没有任何条件成立,您的代码仍然保持不变。不再进行类型检查
对于那些未明确|
运营商用法的人:
queryset |= queryset2
它转换为:
queryset = queryset + queryset
答案 2 :(得分:2)
queryset.none的另一个用途是当你不知道是否会有对象但又不想引发错误时。
示例:
class DummyMixin(object):
def get_context_data(self,**kwargs):
""" Return all the pks of objects into the context """
context = super(DummyMixin, self).get_context_data(**kwargs)
objects_pks = context.get(
"object_list",
Mymodel.objects.none()
).values_list("pk", flat=True)
context["objects_pks"] = objects_pks
答案 3 :(得分:0)
在Django文档的其他示例中查看qs.none()
的位置很有用。例如,如果initializing a model formset using a queryset如果您希望结果表单集为空,则给出的示例为:
formset = AuthorFormSet(queryset=Author.objects.none())
答案 4 :(得分:0)
另一个很好的用例是,如果某些调用方法想要在结果上调用.values_list()
或类似方法。如果该方法返回None,则将显示类似
AttributeError: 'list' object has no attribute 'values_list'
但是,如果您的子句返回MyModel.objects.none()
而不是None
,则调用代码将很高兴,因为返回的数据是空的查询集而不是None对象。
另一种表达方式是,它允许您不混淆返回类型(例如“此函数返回QuerySet或None”,这很麻烦)。