如何在Django 3.0中安全检查特定单条记录是否存在?
解决Django中检查单条记录是否存在的问题
在Django里用get()获取单条记录时,确实会遇到你说的尴尬情况——找不到记录时不会返回None,而是直接抛出DoesNotExist异常,没法用普通的if not逻辑判断。下面给你几个在Django 3.0里安全检查单条记录存在的实用方案:
方案1:用try-except捕获异常(官方推荐)
这是Django官方文档最推荐的方式,直接捕获模型专属的DoesNotExist异常,逻辑完全可控:
try: target_obj = myModel.objects.get(id=100) # 找到记录,执行你的业务逻辑 except myModel.DoesNotExist: # 记录不存在时的处理逻辑 target_obj = None
如果你想统一处理所有模型的“找不到”异常,也可以捕获django.core.exceptions.DoesNotExist,但捕获模型专属的异常会更精准,避免误捕获其他模型的异常。
方案2:用filter()配合first()/last()
既然filter()返回的是QuerySet(自带exists()/count()方法),我们可以用filter()定位记录后,调用first()获取结果——找不到的话会返回None,这样就能用常规Python判断逻辑了:
target_obj = myModel.objects.filter(id=100).first() if target_obj: # 记录存在的处理逻辑 else: # 记录不存在的处理逻辑
这个方法适合不想写try-except的场景,逻辑更简洁;而且因为你的过滤条件是唯一的(比如id),first()返回的结果和get()完全一致,只是不会抛出异常。
方案3:视图场景用get_object_or_404
如果是在Django视图里处理这个需求,可以用get_object_or_404快捷函数——找不到记录时直接返回404响应,省去自己处理异常的麻烦:
from django.shortcuts import get_object_or_404 target_obj = get_object_or_404(myModel, id=100) # 找到记录就继续执行,找不到直接返回404页面
注意:这个方法只适合视图场景,如果是后台任务、脚本等非HTTP请求场景,用这个会直接返回HTTP响应,并不适用。
内容的提问来源于stack exchange,提问作者Darien Marks
相关产品推荐
相关产品推荐

