django objects.get() 找不到结果

django objects.get() does not find result

快速提问。我 运行 以下代码带有 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!")

任何人都可以告诉我我做错了什么吗?

您 运行 进入错误是因为您发现 多个 个对象实例,如果有可能,那么您应该使用 filter() , get() 更适用于您确定只有一个可能条目的情况。

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

the docs,你可以看到get能够捕捉到两种不同的错误——MultipleObjectsReturnedDoesNotExist,你得到的是前者。如果你想继续使用 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!")

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

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

model.objects.get()不好,千万别用。 相反,使用 filter().first() 或单独 filter()。 get在没有匹配或者有多个匹配时会抛出异常,它只有return个对象。 在另一边进行过滤,无论如何都会 return 一个查询集,哪个更好,因为它可以 return 具有零元素或多个元素或单个元素的查询集。