两者中的哪一个是检查实例是否存在的更好,更有效的选择。最多只能返回一条记录。
1)使用过滤器选项,查看是否存在:
x = MyObject.objects.filter(someField=someValue).count()
if x:
#Instance exists
2)使用get并检查异常:
try:
x = MyObject.objects.get(someField=someValue)
except MyObject.DoesNotExist:
#Do Something
上面提到的哪些方法有效或更“ Djangoic”?
甚至更好的方法是使用.exists()
检查特定实例是否存在。
.exists()
来自MyObject.objects.filter(someField=someValue).exists() # return True/False
如果QuerySet包含任何结果,则返回
.exists()
docs:;如果QuerySet包含任何结果,则返回.exists()
。不。 尝试以最简单,最快的方式执行查询可能,,但确实会执行与普通查询几乎相同的查询QuerySet查询。
True
对于与以下两个对象成员资格相关的搜索很有用一个QuerySet以及QuerySet中是否存在任何对象,特别是在大型QuerySet的情况下。
一些文档示例:
示例-1:查找具有唯一字段的模型是否为False
查找模型是否具有唯一性的最有效方法字段(例如primary_key)是exists()
的成员是:
QuerySet
将比以下需要评估和遍历整个查询集:
QuerySet
示例2:查找查询集是否包含任何项目
要查找查询集是否包含任何项目,请使用下面的方法
entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists(): # faster
print("Entry contained in queryset")
将比:更快
if entry in some_queryset: # slower
print("Entry contained in QuerySet")
...但在很大程度上不是(因此需要一个较大的查询集效率提升)。
如果我还想使用该对象,该怎么办?
如果您还想使用该对象(如果存在),则使用if some_queryset.exists(): # faster
print("There is at least one object in some_queryset")
效率不高,因为您将执行2个查询。第一个查询将检查是否存在,第二个查询将获取对象。
[尝试查找单个实例是否存在时,我不喜欢if some_queryset: # slower
print("There is at least one object in some_queryset")
解决方案。
在这种情况下,我会选择鸭子打字(您的第二个选择),因为它更像pythonic:
.exists()
我会说在这样的过滤查询集上使用exist(),
exists
Django文档大多鼓励使用exist()而不是替代方法。您可以在此处了解更多信息。
try:
instance = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
print "Too bad"
else:
instance.do_something()