详解Django的 get_or_none() 函数:获取对象或返回 None

  • Post category:Python

get_or_none() 是 Django ORM 中的一个常用函数,它的作用是在模型对象中查找指定的记录,若找到了则返回该记录,否则返回 None

使用方法:

try:
    obj = MyModel.objects.get(**kwargs)
except MyModel.DoesNotExist:
    obj = None

以上代码是使用 try-except 来处理 DoesNotExist 异常的一种方式,相应的操作会在找到对应记录的时候执行。而使用 get_or_none() 函数可以更加方便地实现相同的功能:

obj = MyModel.objects.filter(**kwargs).first()

filter() 方法返回一个 QuerySet,然后再用 .first() 来获取第一条记录。如果 QuerySet 为空,则返回 None

由于 get_or_none() 通常涉及到的是多条件查询,以下是两个用例:

用例一

MyModel 模型中,我们想要通过 nameage 两个字段来获取一个记录。

使用 try-except 的方式:

try:
    obj = MyModel.objects.get(name='John', age=25)
except MyModel.DoesNotExist:
    obj = None

使用 get_or_none() 的方式:

obj = MyModel.objects.filter(name='John', age=25).first()

这两种方式都可以得到我们想要的记录。

用例二

MyModel 模型中,我们想要取出 created_at 字段在一周以内的最新记录。

使用 try-except 的方式:

from datetime import timedelta, datetime

one_week_ago = datetime.now() - timedelta(days=7)
try:
    obj = MyModel.objects.filter(created_at__gt=one_week_ago).latest('created_at')
except MyModel.DoesNotExist:
    obj = None

使用 get_or_none() 的方式:

one_week_ago = datetime.now() - timedelta(days=7)
obj = MyModel.objects.filter(created_at__gt=one_week_ago).first()

在以上两个例子中,我们都使用了 filter() 方法获取 QuerySet,然后使用 .first() 来获取第一条记录。first() 函数是 Python 内置的,它返回一个序列的第一个元素,如果序列为空,返回 None。这个函数是 get_or_none() 实现的基础。