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

最佳答案



这是行不通的,所以这个问题很容易回答:这种方式不如行之有效的方式:-)

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

因此,我想您是在询问以下两者之间的区别:

拥有QuerySet时的

  • QuerySet.exists() (例如,通过过滤操作)。

    例如:

  •   if User.objects.filter(pk=id).exists():
          # ... do the things that need that user to exist
    
  • Model.objects.get(…) 并捕获 Model.DoesNotExist exception type(或者,如果您想更通用一些,请输入父类 ObjectDoesNotExist )。

    例如:

  •   try:
          user = User.objects.get(pk=id)
      except User.DoesNotExist:
          # ... handle the case of that user not existing
    

    区别在于:
  • QuerySet.exists方法位于查询集上,这意味着您向其询问查询(“是否有与该查询匹配的实例?”),并且您尚未尝试检索任何特定实例。
  • 当您实际尝试检索一个实例且该实例不存在时,会引发该模型的DoesNotExist异常。

  • 使用正确表达您意图的任何一种。

    09-30 14:00