Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查django是否存在特定实例的更好选项_Django_Models - Fatal编程技术网

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

检查django是否存在特定实例的更好选项,django,models,Django,Models,这两个选项中,哪一个是检查实例是否存在的更好、更有效的选项。最多只能返回一条记录 1) 使用过滤器选项并查看它是否存在: x = MyObject.objects.filter(someField=someValue).count() if x: #Instance exists 2) 使用“获取并检查异常”: try: x = MyObject.objects.get(someField=someValue) except MyObject.DoesNotExist:

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

1) 使用过滤器选项并查看它是否存在:

x = MyObject.objects.filter(someField=someValue).count()
if x:
    #Instance exists
2) 使用“获取并检查异常”:

try:
    x = MyObject.objects.get(someField=someValue)
except MyObject.DoesNotExist:
    #Do Something
上面提到的哪种方法更有效或更“Djangoic”

我想说,在过滤后的查询集上使用exists(),如下所示

MyObject.objects.filter(someField=someValue).exists()
Django文档主要鼓励使用exists(),而不是其他方法。你可以在这里了解更多


更好的方法是使用检查特定实例是否存在

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

如果查询集包含任何结果,则返回
True
,如果 不这尝试以最简单、最快的方式执行查询 可能,但它执行的查询与普通查询几乎相同 查询集查询

exists()
查询集,以及查询集中是否存在任何对象,
尤其是在大型查询集的上下文中

文档中的一些示例:

示例1:查找具有唯一字段的模型是否是
查询集的成员

确定模型是否具有唯一性的最有效方法 字段(例如主键)是
QuerySet
is的成员:

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:查找查询集是否包含任何项

要查找queryset是否包含任何项,请在方法下面

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")
。。。但在很大程度上不是这样(因此需要对 效率收益)

如果对象存在,我还想使用它怎么办?


如果要在对象存在时也使用该对象,则使用
.exists()
是无效的,因为这样将执行2次查询。第一个查询是检查是否存在,第二个查询是获取对象。

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

在这种情况下,我选择duck类型(您的第二个选项),因为它更像python:

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

这取决于你想要一张或多张唱片

如果需要以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”)

那么,使用异常是个坏主意吗?@AswinMurugesh我实际上更喜欢用duck类型进行单实例查找,请参阅我的answer@AswinMurugesh如果只需要检查实例是否存在,那么这是最好的方法。文档中甚至建议使用此方法检查实例是否存在。请注意,使用
MyObject.objects.filter(foo='bar').exists()
仍然会从数据库中获取整个对象及其所有字段。使用
MyObject.objects.only('foo').filter(foo='bar').exists()
可以加快查询速度,它将查询更改为仅获取正在筛选的相同列。如果要筛选的字段是主键或具有索引,这将特别有用,因为它允许数据库优化为仅索引查询。YMMV取决于模型下的特定数据库。