我对django exists()
和DoesNotExist
例外有一些疑问。
示例代码:
id = 1
# first
if User.objects.get(pk=id).exists():
# my logic
pass
# second
try:
User.objects.get(pk=id)
# my logic
pass
except User.DoesNotExist:
return 0
我经常使用get()
方法。哪种做法更好?哪个代码更好?第一个还是第二个?
答案 0 :(得分:15)
if User.objects.get(pk=id).exists()
这不起作用,所以问题很容易回答:这种方式不如工作方式: - )
我猜你实际上没有制作Minimal Complete Verifiable Example,因此在发布未经验证的代码时错过了错误。
相反,我想你要问的是:
之间的区别 Model.objects.get(…)
并抓住Model.DoesNotExist
exception type(或者,如果您希望更一般,则为父类型ObjectDoesNotExist
)。
区别在于:
QuerySet.exists
方法位于查询集上,这意味着您询问了一个查询(“是否任何与此查询匹配的实例?”),而您不是但是试图检索任何特定的实例。
当实际尝试检索一个实例时,会引发模型的DoesNotExist
异常,但它不存在。
使用正确表达您意图的任何一个。
答案 1 :(得分:3)
您可以在docs中找到更多信息:
约exists()
,但exists()
仅适用于QuerySet
如果QuerySet包含任何结果,则返回True,否则返回False。这会尝试以最简单,最快的方式执行查询,但它确实执行与普通QuerySet查询几乎相同的查询。
exists()对于与QuerySet中的对象成员资格相关的搜索以及QuerySet中任何对象的存在都很有用,特别是在大型QuerySet的上下文中。
但ObjectDoesNotExist
仅适用于get()
。
您也可以尝试其他方法:
user = User.objects.filter(id=2)
if user:
# put your logic
pass
答案 2 :(得分:0)
在Django模型中,
如果您不使用model.objects.get()
,则将引发错误。在这种情况下,您可以将DoesNotExist
与except:
一起使用
try:
val = Model.objects.get(pk=val) # if nothing found it will raise an exception
exception:
you can trace an exception without mentioning anything on top.
(or)
exception ObjectDoesNotExist:
# it will come here if exception is DoesNotExist
答案 3 :(得分:0)
对于Django 2.0.6版,您可以执行以下操作,并且可以正常运行:
if Model.objects.filter(my_id=objectid).exists():
myobject = get_object_or_404(Model, my_id=objectid)
context = {'myobject': myobject}
return render(request, self.template_name, context)
您可以在此处获取更多信息:https://docs.djangoproject.com/en/2.1/ref/models/querysets/
答案 4 :(得分:0)
据我了解,您是在询问是否使用if语句或尝试捕获您的代码。我个人更喜欢避免使用try catch,认为这是一种丑陋的语法,当我想引发异常时,我使用python关键字raise,对我来说,它使代码更清洁。
代码示例:
user = User.objects.filter(id=2)
if not user:
raise ObjectDoesNotExist
答案 5 :(得分:0)
因为我们在Django中,所以我们将尝试使用Django功能而不是通常的方式(在Python中使用Exceptions)捕获错误。
id = 1
def a_query(id):
qs = User.objects.filter(pk=id)
if qs.exists():
return qs.first()
return None
在这里,方法exist()可帮助您捕获错误(如果有)。
ref:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#django.db.models.query.QuerySet.exists