Python 什么效率更高。objects.filter().exists()或get()在尝试时包装

Python 什么效率更高。objects.filter().exists()或get()在尝试时包装,python,django,testing,django-models,Python,Django,Testing,Django Models,我正在为django应用程序编写测试,我想检查对象是否已保存到数据库中。哪种方法最有效/正确 User.objects.filter(username=testusername).exists() 或 如果您不需要用户,第一个更有效,因为它不会实例化对象。我想说.exists()如果您只是尝试确定是否存在与筛选器匹配的对象,那么它是更好的方法。原因是您的.get()示例只涵盖了三种场景中的两种。还有MultipleObjectsReturned异常,当发现多个对象与筛选器匹配时,会引发该异常

我正在为django应用程序编写测试,我想检查对象是否已保存到数据库中。哪种方法最有效/正确

User.objects.filter(username=testusername).exists()


如果您不需要用户,第一个更有效,因为它不会实例化对象。

我想说
.exists()
如果您只是尝试确定是否存在与筛选器匹配的对象,那么它是更好的方法。原因是您的
.get()
示例只涵盖了三种场景中的两种。还有
MultipleObjectsReturned
异常,当发现多个对象与筛选器匹配时,会引发该异常

我将使用
.get()
获取单个实例,并使用except子句捕获异常工作流。

速度测试:
exists()
vs.
get()+try/except
在Test.py中测试函数:

from testapp.models import User

def exists(x):
    return User.objects.filter(pk=x).exists()

def get(x):
    try:
        User.objects.get(pk=x)
        return True
    except User.DoesNotExist:
        return False
在shell中使用timeit

In [1]: from testapp import test
In [2]: %timeit for x in range(100): test.exists(x)
10 loops, best of 3: 88.4 ms per loop
In [3]: %timeit for x in range(100): test.get(x)
10 loops, best of 3: 105 ms per loop
In [4]: timeit for x in range(1000): test.exists(x)
1 loops, best of 3: 880 ms per loop
In [5]: timeit for x in range(1000): test.get(x)
1 loops, best of 3: 1.02 s per loop

结论
存在()
检查对象是否已保存在数据库中的速度超过10%

谢谢!不过,您是对的,在这种情况下,用户名在Django用户模型中是唯一的,如果不使用正则表达式,则永远不会引发multipleObjectsReturn[我不知道regexs是否可以在get()中使用,还是只能在filter()中使用…]。如果user.exists():return user.first()否则:return false尝试:return user.objects.get(username=testusername)Exception User.DoesNotExist:return False Exception User.MultipleObjectsReturn:return False此时它是个人首选项。如果可读性更重要,我会选择第一种,但是如果你更关心性能,我会选择第二种(尽管差别很小)。
In [1]: from testapp import test
In [2]: %timeit for x in range(100): test.exists(x)
10 loops, best of 3: 88.4 ms per loop
In [3]: %timeit for x in range(100): test.get(x)
10 loops, best of 3: 105 ms per loop
In [4]: timeit for x in range(1000): test.exists(x)
1 loops, best of 3: 880 ms per loop
In [5]: timeit for x in range(1000): test.get(x)
1 loops, best of 3: 1.02 s per loop