2011-04-25 3 views
5

개체 모델이 있습니다. 또한 결과를 필터링 할 수있는 옵션 목록이 있습니다. 필터 목록의 항목 중 하나와 일치하는 모든 개체가 반환되도록 모델의 개체를 필터링하는 쉬운 방법이 있는지 확실하지 않습니다. 예를 들면 :Django. 동일한 옵션으로 여러 옵션이있는 필터

# returns all users with name starting with 'P' 
usersWithPName = User.objects.filter(name__startswith = 'P') 
# 3 letters to filter User model with 
filterList = ['P', 'T', 'R'] 
# ideally would return all users with name starting with either 'P', 'T', or 'R' 
usersWithPTRName = User.objects.filter(name__startswith = filterList) 

(이 경우)에 filterList에있는 항목 중 하나와 일치하는 모든 개체가 반환되도록 사용자 모델을 필터링 할 수있는 방법이 있나요?

답변

16

이 또한 실행시에 Q 필터를 구축 할 수 있습니다 Q objects

from django.db.models import Q 
usersWithPTRName = User.objects.filter(Q(name__startswith='P') | 
             Q(name__startswith='T') | 
             Q(name__startswith='R')) 

수행 할 수 있습니다 :

당신은을 사용하여 파이썬 속성을 필터링 할 수 없습니다
filterList = ['P', 'T', 'R'] 
query = Q() 
for letter in filterList: 
    query = query | Q(name__startswith=letter) 
usersWithPTRName = User.objects.filter(query) 
+0

여기서는 내가 찾고있는 항목 수가 정해져 있다고 가정합니다. filterList는 가변 크기 일 수 있도록 특별히 수행됩니다. 하드 코드 된 Q 객체에 의존하지 않는 무언가가 필요합니다. – paradox870

+0

@ paradoz870 두 번째 예를보십시오 – catavaran

+0

고마워요. 그 덕분에 나는 아주 조금 도와 줬다. 나는 이그나시오의 'reduce()'제안과 함께 사용했다. – paradox870

0

두 가지 선택.

  1. 첫 번째 문자를 모델의 속성으로 포함하십시오.

  2. 고급 쿼리를 사용하십시오.

당신은 두 번째 선택은 필터에 대한 장고 Q 객체를 구축하는 것입니다 filter(first_letter__in=('P','T','R'))

으로 필터링 할 수 있습니다 지금이

class User(models.Model): 
    ... all the usual stuff ... 
    @property 
    def first_letter(self): 
     return self.name[:1] 

을 할 수 있습니다. 여기

시작 : https://stackoverflow.com/search?q=django+Q+objects

+1

Django ORM. –

+0

Django는 조회시 필드 (또는 F 객체) 이외의 것을 사용할 수 없습니다. –

+0

Django Q 객체가 더 좋을 것이라고 생각하지만 올바른 결과를 얻기 위해 두 개의 Q 객체 (및 어떤 것)를 결합하는 방법을 알아 내는데 어려움을 겪고 있습니다. 필자가 필요로하는 것은,리스트 내에 LIKE 필드가있는 모든 오브젝트입니다. 위의 예에서 PATRICK, ROBERT, THOMAS 등이 유효한 결과가됩니다. Q 개체가 "P, T, R 중 임의의 시작"을 수행하는 적절한 구조를 파악할 수없는 것 같습니다. – paradox870

관련 문제