쿼리 세트를 평가 한 다음 필터를 호출하는 방법이 있습니까?쿼리 세트를 평가 한 다음 필터를 호출하십시오.
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
쿼리 세트를 평가 한 다음 필터를 호출하는 방법이 있습니까?쿼리 세트를 평가 한 다음 필터를 호출하십시오.
qs = Model.objects.all()
for element in array:
current = qs.filter(name=element)
여기 호출 qs.filter()
이 qs
승/아무 상관이없는 새로운 검색어 세트를 생성 :이 예에서 한 번만
예를 액세스 데이터베이스를합니다.
또한 the doc에 따르면 qs
및 current
은 특정 작업 때까지 평가되지 않습니다. 당신은 파이썬으로 필터링 할 수 있습니다
:
귀하의 검색어와 배열이 큰 경우qs = Model.objects.all()
for element in array:
current = filter(lambda x: x.name==element, qs)
그러나,이 비효율적이다. 당신이 구축하려는 경우
qs = Model.objects.filter(name__in=array)
: name
값의 일부만을 포함
from collections import defaultdict #
qs = Model.objects.all()
grouped = defaultdict(list)
for obj in qs:
grouped[obj.name].append(obj)
for element in array:
current = grouped[element]
array
경우, 그것은의 검색어를 제한하는 의미가 있습니다 또는, 그룹은 요소에 의해 당신의 검색어 수 데이터베이스에 한 번의 조회로 조회가 이루어지면 Q 오브젝트를 사용해야 할 것입니다.
from django.db.models import Q
q = Q()
for element in array:
q &= Q(name=element)
qs = Model.objects.filter(q)
forloop에서 일부 조작을 수행 할 경우, 배열의 요소로 쿼리. 이것을 피하는 방법? – szaman
@szaman 아, 네 점이 보인다. 하나의 쿼리 세트가 하나의 SQL에 직접 매핑되기 때문에 쉬운 방법은 없습니다. – okm
@szaman ORM 최적화의 경우, 사용법에 따라 다르지만, 프리 페치, 캐시, 파이썬 필터링, 요구 사항 간소화 등을 할 수 있습니다. – okm