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

Better option to check if a particular instance exists django

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

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(),

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

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

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

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

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

来自.exists() docs:

It returns True if the QuerySet contains any results, and False if not. This tries to perform the query in the simplest and fastest way possible, but it does execute nearly the same query as a normal QuerySet query.

exists() is useful for searches relating to both object membership in a QuerySet and to the existence of any objects in a QuerySet, particularly in the context of a large QuerySet.

文档中的一些示例:

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

的成员

查找模型是否具有唯一性的最有效方法 字段(例如 primary_key)是 QuerySet 的成员:

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

示例 2:查找查询集是否包含任何项目

要查找查询集是否包含任何项目,方法如下

if some_queryset.exists(): # faster
    print("There is at least one object in some_queryset")

将快于:

if some_queryset: # slower
    print("There is at least one object in some_queryset")

... but not by a large degree (hence needing a large queryset for efficiency gains).

如果对象存在我也想使用怎么办?

如果您还想使用该对象(如果它存在),那么使用 .exists() 效率不高,因为您将执行 2 个查询。第一个查询将检查是否存在,第二个查询将获取对象。

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

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

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

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

如果您需要以 Python 方式检查是否存在,则需要将它们包含在 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”)