2017-09-18 4 views
0

쿼리는 다음과 같습니다 나는이 중 하나가 B의 C이 "모든"경우 어떻게해야합니까Django에서 "any"를 효과적으로 쿼리하는 방법은 무엇입니까? 예를 들어

a = request.GET['country'] 
b = request.GET['name'] 
c = request.GET['title'] 
... 
result = models.Data.objects.filter('country' = a, 'name' = b, 'title' = c, ...) 

?

프론트 엔드에서 a = "Any"를 받으면 필터에서이 한도를 효과적으로 비워야합니까?

당신은 함수가 매개 변수에서 Q object을 구축 할 수 있습니다

답변

2

:

def _get_filter(name, value): 
    return Q() if value == 'Any' else Q((name, value)) 

&와 조합 :

q = (
    _get_filter('country', request.GET['country']) & 
    _get_filter('name', request.GET['name']) & 
    _get_filter('title', request.GET['title']) 
) 

result = models.Data.objects.filter(q) 

가능하다면, 나는 또한 요청의 소스를 얻을 것 (frontend?)를 사용하여 빈 문자열처럼 "Any"를 나타내는 더 나은 값을 보냅니다.

0

단일 쿼리에서 모든 것을 수행 할 필요는 없습니다. 모든 것이 완료 될 때까지 쿼리가 실행되지 않습니다. 모든 것이 완료 될 때까지

result = models.Data.objects.all() 

if a != 'any': 
    result = result.filter('country' = a) 
if b != 'any': 
    result = result.filter('name' = b) 
if c != 'any': 
    result = result.filter('title' = c) 
... 

쿼리는 데이터베이스에 대해 실행되지 않습니다, 그래서 이것은 정말 여분의 쿼리를 추가하지 않습니다 :

당신은 사용할 수 있습니다.

관련 문제