Django:何时使用QuerySet无

sup*_*er9 20 python django

刚刚在django文档中遇到过这个问题

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

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

为什么要返回EmptyQuerySet?

Dan*_*elB 24

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

优点是如果你知道没有结果(或者不想要结果)并且你仍然需要一个,那么none()就不会命中数据库.

对于一个非现实的示例,假设您有一个API,您可以在其中查询您的权限.如果帐户还没有得到证实,因为你已经有了Account对象,你可以看到,account.is_activated就是False,你可以跳过只要使用检查权限的数据库Permission.objects.none()


Arp*_*ngh 10

如果您想要附加到查询集但希望开始使用空的类似于我们实例化一个空列表开始的条件,但逐渐向它添加有意义的值示例..

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
Run Code Online (Sandbox Code Playgroud)

get_me_queryset应该几乎总是返回django.db.models.query.QuerySet的实例(因为编程好)而不是None或[],否则以后会引入头痛......

这种方式即使没有任何条件成立,您的代码仍将保持不变.没有更多类型检查

对于那些get_me_queryset在这里没有表明运营商用途的人:

queryset |= queryset2
Run Code Online (Sandbox Code Playgroud)

它转化为:

queryset = queryset + queryset
Run Code Online (Sandbox Code Playgroud)