检查特定实例是否存在的更好选择 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(),而不是替代方法。您可以在此处阅读更多相关信息。
甚至 更好的方法是使用 .exists()
检查特定实例是否存在。
MyObject.objects.filter(someField=someValue).exists() # return True/False
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”)
这两者中哪一个是检查实例是否存在的更好、更有效的选择。最多只能返回一条记录。
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(),而不是替代方法。您可以在此处阅读更多相关信息。
甚至 更好的方法是使用 .exists()
检查特定实例是否存在。
MyObject.objects.filter(someField=someValue).exists() # return True/False
It returns
True
if the QuerySet contains any results, andFalse
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”)