2014-04-18 4 views
2

자동 완성 양식의 백엔드 코드를 작성하고 있습니다. 내가 반품 한 각 항목은 해당 카테고리 내의 카테고리 이름과 숫자로 설명됩니다.문자열을 비교하기위한 장고 필터의 "in"또는 "reverse contains"쿼리

사용자가 "CAT123"을 입력하면 장고 필터를 사용하여 사용자 쿼리에 포함 된 범주 이름이나 숫자로 필터링합니다.

즉, 내가 좋아하는 쿼리를 실행하려면 :

Entry.objects.filter(Q(category__in = query) | Q(num__in = query)) 

필터 테스트 카테고리 AAA 쿼리 AAA 555에있는 경우, 그리고 수 555 각각 쿼리 AAA 555에있는 경우.

그러나 __in은 목록에만 적용되는 것으로 보이며 __contains은 다른 방식으로 확인합니다 ('AAA 555'는 'AAA'에 없음).

"문자열에 포함되어 있습니까?"아이디어에 사용할 올바른 필터 식은 무엇입니까?

필터가 Q(query__contains = category) 인 것처럼 보이게하려면 contains 표현을 뒤집을 방법이 있습니까?

답변

0

__contains을 사용해야하지만 으로 쿼리를 분할하여 전에 사용해야합니다. 이것은 정규 표현식을 사용하는 좋은 사례이다. 다음은 간단한 예제이지만 유니 코드 범주 이름 (예 : üéøā와 같은 문자)에서는 제대로 작동하지 않습니다. 좀 더 유연한 정규 표현식을 원한다면 튜토리얼을 찾아보십시오.

import re 

entries = [ 
     "sdf", 
     "A124", 
     "124", 
     "ASDF 124", 
     ] 

for i, e in enumerate(entries): 
    number = re.search(r'\d+', e) 
    word = re.search(r'[A-Za-z]+', e) 
    print i 
    if number: 
     print(" " + number.group()) 
    if word: 
     print(" " + word.group()) 

반환 :

0 
    sdf 
1 
    124 
    A 
2 
    124 
3 
    124 
    ASDF 

당신은 다음과 같이 캡처 일치를 사용합니다 :

Entry.objects.filter(Q(category__contains = word) | Q(num__contains = number))