2017-03-06 8 views
2

first()limiting querysetsと同じかどうかを知りたいと思います。Djangoマネージャーfirst()vs Model.objects.all()[:1]

Model.objects.first()Model.objects.all()[:1]と同じですか?

あなたはfirst()Model.objects.all()[0]と同じなので、私の考えは、彼らが同じではないことですが、我々はfirst()として便利なメソッドを持っている理由、私は理解していないことを覚えておくました。

+1

両方の末尾に '.query'を追加して出力内容を確認することができます。 '.first()'と '.all()[0]'はまったく同じことをしません。 '[:1]'はインスタンスではなくクエリーセットを返します – Sayse

+2

[ソースを見てください](https://github.com/django/django/blob/60e52a047e55/django/db/models/query.py) #L544) – Kos

+1

'.query'は' first() 'と動作しません。Querysetでなければなりません。とにかく、私の男達は解決されます、ありがとう。 – RompePC

答えて

4

Model.objects.first()は1つのインスタンス、つまりNoneを返します。Model.objects.all()[:1]は、0または1つのインスタンスを含むクエリーセットのスライスを返します。

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 
2

スピードについて:ここではDjango 1.10からfirst()のソースコードです。 ipythonではtimeitモジュールを使用して、私が見つかりました:あなたがフィールドに

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 

にアクセスしようとすると、

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 

は違いがまだありますが、インデックス付きのバージョンを使用する前に、長さを検証する必要があるだろう心を持っています。あなたの質問に答えると、それは同じではないようです。

注:モデルには、1つのcharフィールドを持つレコードは2つしかありません。データベースはSQLite3です。レコード、フィールド、および別のDBエンジンで異なる動作をする可能性があります

関連する問題