2017-11-14 5 views
0

QuerySets이 게이스럽고 특정 조건에서만 데이터베이스가 항상 손상되는 것을 피하기 위해 evaluated이라는 사실을 알고 있습니다.Django QuerySet 체이닝, 서브셋 및 캐쉬

일반 쿼리 집합 (모든 항목 검색)이 주어진 다음 더 세련된 쿼리 세트 (예 : 필터 추가)를 사용하여 여러 SQL 쿼리로 연결되는지 여부를 모르겠습니까?

예 :

all_items = MyModel.objects.all() 
subset1 = all_items.filter(**some_conditions) 
subset2 = subset1.filter(**other_condition) 

1)이 3 개 가지 SQL 쿼리를 만들겠습니까? 또는 3 변수가 평가되는지 (예 : 반복)?

2)이 방법이 효율적입니까? 아니면 모든 항목을 가져 와서 목록으로 변환하고 파이썬으로 필터링하는 것이 더 좋을까요?

+0

사용자가 데이터에 액세스 시작하는 경우에만 데이터베이스에 타격을 줄 것으로 예상된다. –

+1

하위 집합 2에만 액세스한다고 가정 해 보겠습니다.이 쿼리는 1 개의 쿼리 또는 3 개만 작성합니까? – Leonardo

답변

0
  1. 예. 이것은 3 가지 SQL 쿼리입니다. (왜냐하면 당신은 3 가지 다른 객체를 사용하기 때문입니다 : all_items, 1,, , subset2). 당신이 동일한 개체에서 여러 querues을 할 경우

    all_items = MyModel.objects.all() 
    subset1 = all_items.filter(**some_conditions) 
    subset2 = subset1.filter(**other_condition) 
    


    검색어 세트는 게으른 여러 조건이 목록에 넣어와 같은 것을 사용하는 경우

    q = Entry.objects.filter(headline__startswith="What") 
        q = q.filter(pub_date__lte=datetime.date.today()) 
        q = q.exclude(body_text__icontains="food")<br> 
    


2 : 를 MyModel.objects.filter(reduce(operator.or_, [Q(some_model__icontains=item) for items in conditionList]))

당신은 단지 마지막 쿼리가 하나의 데이터베이스 쿼리 요청이 실행 된 후 subset2을 설정 열거 경우)

import operator 
from functools import reduce 
from django.db.models import Q 
+0

1) 수정하거나 설명하십시오. 2) 이전을 수정하면 투표 할 수 있습니다.가능한 필드는'some_model__related_model = value' 필드의 조건과 결합하면 될 수 있습니다. 필터는 정상이지만 추가 쿼리의 위험없이 나중에 항목을 부분 집합으로 구분하는 것은 일반적으로 쉽지 않습니다. select_related 또는 annotate가 필요할 수 있습니다. 마지막으로 DRY 코드가 아닙니다. – hynekcer

+0

동일한 개체에 대해 몇 개의 쿼리를 만들면 QuerySets가 게으른됩니다. q = Entry.objects.filter (headline__startswith = "What") q = q.filter (pub_date__lte = datetime.date.today() q = q.exclude (body_text__icontains = " 음식 ")) 그는 3 개의 다른 객체에 대한 질의를했습니다. 'all_items = MyModel.objects.all() subset1 = all_items.filter (** some_conditions) subset2 = subset1.filter (** other_condition)' – FirePower

+0

@Leonardo 불확실한 질문 간단한 대답이 없습니다. 그는 아마 query = 데이터베이스에 대한 요청을 이해합니다. 그는 3 개의 쿼리 결과를 사용하지 않습니다. 그것은 달려있다. 정답은 3 또는 2 또는 1 일 수 있습니다. "실제로 QuerySet을 설명하는 항목을 가져 오기 위해 데이터베이스로 이동하지 않고도 QuerySet을 생성하고 전달하고 다른 QuerySet과 결합 할 수 있습니다." (docs) – hynekcer

0

1을 가져, 그 최적입니다.

2) 대부분의 응용 프로그램 코드를 작성한 후 적절한 양의 데이터를 측정하기 전에 조기 최적화를 피하십시오. 데이터베이스가 커지면 마침내 가장 중요한 문제가 무엇인지 결코 알 수 없습니다. 예 : 하위 집합을 요청하면 데이터베이스에 캐싱을하면 쿼리가 더 빨리 수행됩니다. 메모리 양은 다른 최적화와는 반대입니다. 어쩌면 메모리의 모든 데이터를 나중에 보관할 수 없으며 사용자는 데이터 페이지에서만 액세스 할 수 있습니다. 깨끗한 읽을 수있는 코드는 나중에 제거해야하는 20 %의 최적화보다 나중에 가능한 최적화를 위해 더 중요합니다. 쿼리 (게으른) 평가에 대한

다른 중요한 단락 :
When QuerySets are evaluated
QuerySets are lazy
Laziness in Django