我们可以使用 queryset.first() 而不是捕获异常吗?

问题描述

当我不能完全确定是否有任何带有 MyModel.objects.filter(pk=1).first() 的对象时,我通常使用 MyModel.objects.get(pk=1) 而不是 pk=1

在这种情况下这样做是不好的做法还是我需要

try:
  MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
  print('not found')

我通常使用 MyModel.objects.filter(pk=1).first() 来减少代码

解决方法

这没什么不对。如果对象不存在,您会得到 None。与使用 .exists()

相比,它可以节省使用多个查询访问数据库的时间

我会在没有评论的情况下将以下内容称为自我记录,但如果您认为不是,请发表评论

obj = MyModel.objects.filter(pk=1).first() 
if obj is None:
    # no such object exists...
    ...
else
    # process obj
    ...

我刚刚想到,如果您使用的是最新的 Python,这是“海象”运算符的用途

if obj := MyModel.objects.filter(pk=1).first() is None:

但不确定我更喜欢它!

,

您可以使用 django 内置方法 get_object_or_404 如果对象不退出将返回 404 页面

from django.shortcuts import render,get_object_or_404

obj = get_object_or_404(MyModel,id=pk)