django objects.get()找不到结果

时间:2016-02-16 15:16:30

标签: django database 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!")

有人可以给我一个关于我做错的提示吗?

2 个答案:

答案 0 :(得分:2)

您遇到错误是因为您找到对象的多个实例,如果有可能那么您应该使用filter()get()更多是因为如果您确定只有一个可能的条目。

目前正在发生的是你正在捕捉所有错误,而不仅仅是您可能习惯的DoNotExist错误。

the docs,您可以看到get能够捕获两个不同的错误 - MultipleObjectsReturnedDoesNotExist,您将获得前者。如果您希望继续使用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