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)
有人可以告诉我我做错了什么吗?
当您非常确定只有一个结果时,请使用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)
您遇到错误是因为您发现一个对象的多个实例,如果这是一种可能性,那么您应该使用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),记录错误,或提供默认值以继续。