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
模型中,我们想要通过 name
和 age
两个字段来获取一个记录。
使用 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()
实现的基础。