Django经理first()vs Model.objects.all()[:1]

时间:2017-03-06 09:02:38

标签: python django django-queryset

我想知道first()是否与limiting querysets相同。

Model.objects.first()Model.objects.all()[:1]的速度相同吗?

你要记住first()Model.objects.all()[0]相同,所以我的想法是它们不一样,但我不明白为什么我们有一个方便的方法first()

2 个答案:

答案 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。对于更多记录,字段和另一个数据库引擎,它可能会有所不同