如何高效触发DoesNotExist异常?单字段获取的代码优化问询
问题解答
一、高效检查ID存在性并触发DoesNotExist的替代方案
你当前使用的MyModel.objects.get(pk=my_model_id)会查询完整实例,可通过只获取主键字段来优化性能,同时保持逻辑一致:
MyModel.objects.only('pk').get(pk=my_model_id)
这个写法在ID不存在时依然会抛出DoesNotExist异常,但数据库仅返回主键字段的数据,传输和处理成本更低,代码也保持简洁清晰。
如果追求极致轻量化,也可以用exists()配合手动抛异常,但代码会稍显冗长,不如上述方案兼顾简洁与效率:
from django.core.exceptions import ObjectDoesNotExist if not MyModel.objects.filter(pk=my_model_id).exists(): raise ObjectDoesNotExist("MyModel matching query does not exist.")
二、获取单个字段的高效简洁方案
针对仅需单个字段的场景,推荐用values_list搭配get()的写法,兼顾效率与代码简洁性:
item = MyModel.objects.filter(pk=my_model_id).values_list('item', flat=True).get()
也可使用values(适合后续可能扩展多字段的场景):
item = MyModel.objects.filter(pk=my_model_id).values('item').get()['item']
这两种写法的核心优势:
- 仅查询指定的
item字段,数据库返回数据量远小于查询完整实例; - 一行代码完成逻辑,可读性强;
- ID不存在时自动抛出
DoesNotExist异常,可直接被全局异常处理器捕获并返回404响应,无需额外判断。
内容的提问来源于stack exchange,提问作者Baz
相关产品推荐
相关产品推荐

