Django:何时使用QuerySet Non

2024-04-25 08:11:00 发布

您现在位置:Python中文网/ 问答频道 /正文

刚刚在django docs里遇到这个

Calling none() will create a queryset that never returns any objects and no query will be executed when accessing the results. A qs.none() queryset is an instance of EmptyQuerySet.

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

为什么要返回空查询集?


Tags: anddjangonononedocsobjectsthatcreate
3条回答

通常是在需要提供QuerySet的情况下,但是没有一个可以提供,例如调用方法或提供给模板。

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

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

如果希望附加到querysets,但希望空的querysets以 类似于我们实例化空列表的条件,空列表以开始,但逐渐地将有意义的值附加到空列表中 例子。。

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[],否则它将在以后引入头痛。。

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

对于那些不了解|运算符用法的用户,请执行以下操作:

queryset |= queryset2

它转化为:

queryset = queryset + queryset

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

相关问题 更多 >