Django的; 是否可以为queryset设置默认值

use*_*652 8 django

employee = Employee.objects.filter('age' = 99)
Run Code Online (Sandbox Code Playgroud)

我们假设此查询集为空.

如果我使用employee[0],那将返回索引超出范围错误,那么是否可以在此处使用None作为默认值?

`employee[0] or None`? # This won't work, but this is what I mean.
Run Code Online (Sandbox Code Playgroud)

Dom*_*ger 9

如果您只想获得单个实例,请使用get,而不是filter:

employee = Employee.objects.get(age = 99)
Run Code Online (Sandbox Code Playgroud)

如果这不存在,您将获得一个Employee.DoesNotExist异常,您需要捕获它.如果有一个以上的99岁员工,您将获得一个Employee.MultipleObjectsReturned异常,您可能希望捕获该异常.

如果你感到懒惰,总会有django烦人get_object_or_None!

from annoying.functions import get_object_or_None

obj = get_object_or_None(Employee, age=99)
Run Code Online (Sandbox Code Playgroud)

如果你不想使用所有django-annoying,你总是可以添加get_object_or_None到某处,它看起来像这样:

def get_object_or_None(klass, *args, **kwargs):
    """
    Uses get() to return an object or None if the object does not exist.

    klass may be a Model, Manager, or QuerySet object. All other passed
    arguments and keyword arguments are used in the get() query.

    Note: Like with get(), a MultipleObjectsReturned will be raised if
    more than one object is found.
    """
    queryset = _get_queryset(klass)
    try:
        return queryset.get(*args, **kwargs)
    except queryset.model.DoesNotExist:
        return None
Run Code Online (Sandbox Code Playgroud)


Ari*_*iel 7

在Django> = 1.6上有first方法,所以你可以这样做:

employee = Employee.objects.filter(age=99).first()
Run Code Online (Sandbox Code Playgroud)

但请注意,只有在知道QuerySet保证返回1或0结果时才有意义.


iko*_*tia 5

这应该有效:

employee[0] if employee else None
Run Code Online (Sandbox Code Playgroud)

  • 不它不是。只有当employee 的值是True-like 时,它​​才计算employee[0] 的值。空 QuerySet 是类似 false 的值,因此如果您有空 QuerySet,您将得到 None。 (3认同)