get_or_none() 函数现在是 proposed、multiple times。拒绝通知是功能蠕变,您可能同意也可能不同意。该功能在 first() 查询集方法中存在——语义略有不同。
但首先要做的是:
当找不到World 对象时,经理抛出World.DoesNotExist,ObjectDoesNotExist 的一个专门子类:
try:
personalProfile = World.objects.get(ID=personID)
except World.DoesNotExist:
pass
还有get_object_or_404() 在找不到对象时引发Http404 异常。
您也可以创建自己的get_or_none()。一个可能的实现可能是:
def get_or_none(queryset, *args, **kwargs):
try:
return queryset.get(*args, **kwargs)
except ObjectDoesNotExist:
return None
请注意,当找到多个匹配对象时,这仍然会引发MultipleObjectsReturned。如果您总是想要第一个对象而不考虑其他对象,您可以使用first() 进行简化,当查询集为空时返回None:
def get_or_none(queryset, *args, **kwargs):
return queryset.filter(*args, **kwargs).first()
但是请注意,要使其可靠地工作,您需要正确的对象顺序,因为在存在多个对象时first() 可能是不确定的(它可能从用于过滤的数据库索引中返回第一个对象查询,索引和基础表都不需要排序,甚至没有可重复的顺序)。
但是,仅当使用检索对象对于进一步的程序流程而言是严格可选的时才使用两者。如果无法检索对象是错误,请使用get_object_or_404()。当一个对象不存在时应该创建它,使用get_or_create()。在这些情况下,两者都更适合简化程序流程。