2013-07-12 2 views
2

많은 필드가있는 모델이 있습니다. 미리 정의 된 필드 목록에서 빈 필드가있는 개체를 선택하는 쿼리 집합을 작성하고 싶습니다.Django, 자동으로 긴 쿼리 세트를 작성하십시오

말 (필드, 모든 중 어떤) :

fields=['a','b','c','d','e','f','g','h','i','j','k'] 

나는

model.objects.filter(Q(a==Null) | Q(b==Null) | Q(c==Null) ... 

더 나은 방법이 있나요 쓸 수 있을까?

답변

2

어때요?

qObj = None 
for field in fields: 
    newQ = Q(**{field : Null}) 
    if qObj is None: 
     qObj = newQ 
    else: 
     qObj = qObj | newQ 

가 나는 qObj = None 및 다음 확인을 사랑하지 않지만, Q 오브젝트를 구축 할 때 나는 주위에 방법을 알고하지 않습니다. 그러나 일반적으로 Q(**{field: Null})을 찾고있을 수도 있습니다.

+0

멋진 간단한 접근 방식입니다. 감사합니다. – wjdp

0

예쁜 난독 화 (플러스 reduce()lambda은 BDFL으로도 비판하고있다),하지만 작동합니다 :

from django.db.models import Q 
q_result = reduce(lambda q, name: q | Q(**{name: None}), fields, Q()) 

그럼 그냥 사용

model.objects.filter(q_result) 
1

을 나는이 그것을해야한다고 생각 :

query_terms = {} 
for fieldname in fields: 
    query_terms['%s__isnull' % fieldname] = False 
model.objects.exclude(**query_terms) 

또는 2.7 이상인 경우 bui에 사전 이해도를 사용하십시오. ld query_terms.

원래 쿼리는 함께 사용해야하거나 사용하지 않아야하기 때문에 어색합니다. 네가 부정을 제외하면 암시 적 및를 사용할 수 있습니다.

+1

그것은 또 다른 (아마도 좋은) 접근법입니다 :'NULL' 필드가없는 모든 결과를 제외하십시오. – Tadeck

+0

또한 좋은 간단한 접근법, 나는 둘 다 시도하는 것이 가장 효과가 있는지보십시오 – wjdp

0

테이블 디자인 방법을 다시 생각해 볼 수 있습니다. 솔루션을 찾는 데 성공하더라도 성능 문제가 발생할 수 있습니다.

PostgreSQL을 사용하는 경우 HStore가 함께 제공됩니다.

이 링크를 사용하면 Working with the hstore data type in PostgreSQL 9.0/9.1/9.2과 Django 용이 라이브러리를 사용하여 hstore, PostgreSQL HStore module integration for django orm을 사용할 수 있습니다.

Hstore는 키 값 저장소이므로 값이있는 필드 만 저장하면됩니다.

+0

많은 수의 레코드를 다루지 않으므로 문제가되지 않아야합니다. 특정 필드의 상태에 따라 저장시 업데이트되는 부울 필드를 추가하는 것이 좋습니다. – wjdp

+0

내가 제공 한 해결책은 상황이 조금 털이 많아 질 때 다른 옵션 일 수 있습니다. 필요할 때 언제든지 알 수 있습니다. – rendykstan

관련 문제