我想知道first()
是否与limiting querysets相同。
Model.objects.first()
与Model.objects.all()[:1]
的速度相同吗?
你要记住first()
与Model.objects.all()[0]
相同,所以我的想法是它们不一样,但我不明白为什么我们有一个方便的方法first()
。
答案 0 :(得分:5)
Model.objects.first()
返回一个实例或None
,而Model.objects.all()[:1]
返回查询集的一个切片,零个或一个实例。这是来自Django 1.10的first()
源代码:
def first(self):
"""
Returns the first object of a query, returns None if no match is found.
"""
objects = list((self if self.ordered else self.order_by('pk'))[:1])
if objects:
return objects[0]
return None
答案 1 :(得分:3)
关于速度。在ipython中使用timeit模块我发现:
In [11]: %timeit rompepc.models.SampleModel.objects.all()[:1][0]
1000 loops, best of 3: 326 µs per loop
In [12]: %timeit rompepc.models.SampleModel.objects.first()
1000 loops, best of 3: 464 µs per loop
当您尝试访问字段
时仍然存在差异In [14]: %timeit rompepc.models.SampleModel.objects.all()[:1][0].sample_field
1000 loops, best of 3: 323 µs per loop
In [15]: %timeit rompepc.models.SampleModel.objects.first().sample_field
1000 loops, best of 3: 461 µs per loop
请记住,在使用索引版本之前,您需要验证长度。回答你的问题,似乎不一样。
注意:模型中只有两个记录,只有一个char字段。数据库是SQLite3。对于更多记录,字段和另一个数据库引擎,它可能会有所不同