Django:何时使用QuerySet无

时间:2013-01-12 03:22:20

标签: python django

刚刚在django docs

中遇到过这个问题
  

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

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

为什么要返回一个EmptyQuerySet?

5 个答案:

答案 0 :(得分:20)

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

优势在于,如果你知道没有结果(或者不想要结果),你仍然需要一个,none()不会打到数据库。

对于一个不现实的例子,假设您有一个API,您可以在其中查询您的权限。如果帐户尚未确认,因为您已经拥有Account对象,并且可以看到account.is_activatedFalse,您可以跳过检查数据库的权限,只需使用{{ 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”,这很麻烦)。