快速提问。我使用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!")
有人可以给我一个关于我做错的提示吗?
答案 0 :(得分:2)
您遇到错误是因为您找到对象的多个实例,如果有可能那么您应该使用filter()
,get()
更多是因为如果您确定只有一个可能的条目。
目前正在发生的是你正在捕捉所有错误,而不仅仅是您可能习惯的DoNotExist错误。
从the docs,您可以看到get
能够捕获两个不同的错误 - MultipleObjectsReturned
和DoesNotExist
,您将获得前者。如果您希望继续使用get
,则应明确地使用{/ p>
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!")
就实际的错误处理而言,只是打印到控制台不是很有帮助,这可能意味着如果没有丢失的条目值,此后的代码无法正常运行,您可能希望返回错误响应(即HttpResponseNotFound),记录错误,或提供默认值以继续。
答案 1 :(得分:0)
objects.get()。但最好使用objects.filter()。first(),因为它不会导致任何错误。例如,你可以写:
entry = MyDatabase.objects.filter(ort=key, user=username).first()
而不是
entry = MyDatabase.objects.get(ort=key, user=username)
然后你可以检查查询是否返回了任何对象:
if entry:
#some actions