django objects.get() 找不到结果

use*_*983 5 database django except

快速提问。我使用语句运行以下代码try except(因为数据库中可能没有条目)。对于某些条目,我遇到了 except 块,尽管数据库中肯定有一个条目!当使用objects.filter()代替时,objects.get()我没有这个问题 - 它永远不会进入数据库中相同条目的 except 块!

key = "anystringasprimarykey"
username = "anyusername"
try:
    entry = MyDatabase.objects.get(ort=key, user=username)
except:
    print("oh, exception!")
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我做错了什么吗?

Daw*_*ian 5

当您非常确定只有一个结果时,请使用objects.get()。但最好使用objects.filter().first(),因为它不会导致任何错误。例如你可以写:

entry = MyDatabase.objects.filter(ort=key, user=username).first()
Run Code Online (Sandbox Code Playgroud)

代替

entry = MyDatabase.objects.get(ort=key, user=username)
Run Code Online (Sandbox Code Playgroud)

然后您可以检查查询是否返回任何对象:

if entry:
    #some actions
Run Code Online (Sandbox Code Playgroud)


Say*_*yse 3

您遇到错误是因为您发现一个对象的多个实例,如果这是一种可能性,那么您应该使用filter(), get()is more 对于您确定只有一个可能的条目的情况。

当前发生的情况是您正在捕获所有错误,而不仅仅是您可能习惯的DoesNotExist 错误。

文档中,您可以看到它get能够捕获两个不同的错误 -MultipleObjectsReturned并且DoesNotExist您得到的是前者。如果您想继续使用,get您应该显式捕获两者

try:
    entry = MyDatabase.objects.get(ort=key, user=username)
except MultipleObjectsReturned:
    print("oh, I've forgotten to do something with the exception!")
except DoesNotExist:
    print("oh, I've forgotten to do something with the exception!")
Run Code Online (Sandbox Code Playgroud)

就您的实际错误处理而言,仅打印到控制台并不是很有帮助,这可能意味着如果没有缺少条目值,后面的代码将无法正常运行,您可能想要返回错误响应(即HttpResponseNotFound),记录错误,或提供默认值以继续。

  • 除此之外,您应该使用 except MyDatabase.DoesNotExist 来捕获更准确的异常类型。正是一般的“ except ”隐藏了您所困惑的异常。 (5认同)