更好的选项来检查特定实例是否存在django

问题描述 投票:10回答:3

两者中的哪一个是检查实例是否存在的更好,更有效的选择。最多只能返回一条记录。

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”?

django models
3个回答
19
投票

甚至更好的方法是使用.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个查询。第一个查询将检查是否存在,第二个查询将获取对象。


5
投票

[尝试查找单个实例是否存在时,我不喜欢if some_queryset: # slower print("There is at least one object in some_queryset") 解决方案。

在这种情况下,我会选择鸭子打字(您的第二个选择),因为它更像pythonic:

.exists()

0
投票

我会说在这样的过滤查询集上使用exist(),

exists

Django文档大多鼓励使用exist()而不是替代方法。您可以在此处了解更多信息。

try: instance = MyModel.objects.get(id=1) except MyModel.DoesNotExist: print "Too bad" else: instance.do_something()

© www.soinside.com 2019 - 2024. All rights reserved.