2017-03-06 1 views
2

first()limiting querysets과 같은지 알고 싶습니다.Django manager 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()은 하나의 인스턴스 또는 None을 반환하고 Model.objects.all()[:1]은 0 개 또는 하나의 인스턴스와 함께 쿼리 세트의 슬라이스를 반환합니다. Dhango 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 
2

속도 관련. 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 

여전히 차이가있다. 귀하의 질문에 대답, 그것은 같지 않은 것 같습니다.

참고 : 단일 문자 필드가있는 모델에는 두 개의 레코드 만 있습니다. 데이터베이스는 SQLite3입니다. 더 많은 레코드, 필드 및 다른 DB 엔진에서 다르게 동작 할 수 있습니다.