Django exists()与DoesNotExist

时间:2016-12-01 12:01:13

标签: python django web

我对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()方法。哪种做法更好?哪个代码更好?第一个还是第二个?

6 个答案:

答案 0 :(得分:15)

  

if User.objects.get(pk=id).exists()

这不起作用,所以问题很容易回答:这种方式不如工作方式: - )

我猜你实际上没有制作Minimal Complete Verifiable Example,因此在发布未经验证的代码时错过了错误。

相反,我想你要问的是:

之间的区别

区别在于:

  • 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(),则将引发错误。在这种情况下,您可以将DoesNotExistexcept:一起使用

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