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

时间:2015-09-29 15:50:08

标签: django models

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

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

4 个答案:

答案 0 :(得分:14)

甚至更好的方法是使用.exists() 来检查特定实例是否存在。

MyObject.objects.filter(someField=someValue).exists() # return True/False

来自.exists() docs:

  

如果QuerySet包含任何结果,则返回True;如果包含False,则返回exists()   不。此尝试以最简单,最快速的方式执行查询   可能,但它确实执行与普通查询几乎相同的查询   QuerySet查询。

     

QuerySet对于与两个对象成员资格相关的搜索非常有用   QuerySet以及QuerySet中是否存在任何对象,   特别是在大型QuerySet的上下文中。

文档中的一些示例:

示例-1:查找具有唯一字段的模型是否为QuerySet的成员

查找具有唯一性的模型的最有效方法 field(例如primary_key)是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")

会比以下更快:

.exists()
  

...但不是很大程度上(因此需要一个大的查询集)   效率提升)。

如果我还想使用该对象,该怎么办?

如果您想要同时使用该对象,那么使用# file filepath/filename 效率不高,那么您将执行2次查询。第一个查询将检查是否存在,第二个查询将是获取对象。

答案 1 :(得分:4)

在尝试查找单个实例是否存在时,我不喜欢exists解决方案。

在这种情况下,我选择 duck typing (你的第二个选项),因为它的方式更加pythonic:

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

答案 2 :(得分:0)

我想说在过滤的查询集上使用exists(),就像这样,

MyObject.objects.filter(someField=someValue).exists()

Django文档主要鼓励使用exists(),而不是替代方法。你可以在这里阅读更多相关信息。

https://docs.djangoproject.com/en/1.8/ref/models/querysets/

答案 3 :(得分:0)

这取决于你想要获得一条记录还是多条记录

如果您需要以 Pythonic 的方式检查存在,则需要将它们包含在 try 和 except 块中

try: 
  instance = MyModel.objects.all().get(condition) 
  #can continue to use instance  
except MyModel.DoesNotExist: 
  #do something if model does not exist  
  Print(“model instances doesn't exist”)  

如果您使用过滤器或获取所有实例

instances = MyModel.objects.all().filter(condition)  
If instances: 
  #if list of instances have Atleast one instance  
  Pass 
else: 
  #do something if model does not exist  
  Print(“model instances doesn't exist”)