2010-07-09 3 views
0

대/소문자를 구분하지 않는 쿼리를 수행하려고합니다.여러 검색 단어를 지원하는 대/소문자를 구분하지 않는 쿼리

def search(request): 
    query = request.GET.get('q', '') 
    query = query.lower() 
    product_results = [] 
    category_results = [] 
    if query: 
     product_results = Product.objects.filter(Q(title__in=query.split())| 
                Q(brand__in=query.split())| 
                Q(description__in=query).split()) 
     category_results = Category.objects.filter(title__in=query.split()) 

내 문제가 오브젝트 필드는 일반적으로 첫 글자 대문자가된다 : 나는 일반적으로 __icontains을 사용하지만,이 .split() 메소드를 지원하지 않기 때문에, 내가 대신 __in 사용에 붙어 따라서 모든 소문자 쿼리는 항상 음수를 반환합니다.

어쨌든이 주위?

답변

1

나는 대신에 icontains를 사용하여 문자열에서 코드를 생성하기 위해 exec를 사용하여이 문제를 해결했다. 나는 인정한다. 그다지 우아하지 않고 보안을 위해 감사해야하지만 효과가 있었다.

는 검증되지 않은/의사 참조 :

query = "product_results = Product.objects.filter(" 
for word in words: 
    query += "Q(title__icontains(word))|" 
    query += "Q(brand__icontains(word))|" 
    query += "Q(description__icontains(word))|" 
query = query[:-1] # remove the trailing | 
query += ")" 
exec("product_results = "+query) 

다시, 이것은 아마도 바람직하지 않습니다, 그리고 나는이 할 수있는 더 나은 방법이있을거야,하지만이 한때 내가 생각 핀치에 나를 고정 나는 공유 할 것이다. 또한이 코드는 더 이상 sqlalchemy로 전환 했으므로이 코드를 사용하지 않습니다.이 sqlalchemy는 "또는"객체가 목록을 허용하기 때문에 이러한 종류의 동적 쿼리를 좀 더 쉽게 만듭니다. 공유

1

덕분에, 나는 연장 간과

def search(request): 
    query = request.GET.get('q', '') 
    query = query.split() 
    product_results = [] 
    category_results = [] 
    if query: 
     for x in query: 
      product_results.extend(Product.objects.filter(Q(title__icontains=x)| 
                 Q(brand__icontains=x)| 
                 Q(description__icontains=x))) 
      category_results.extend(Category.objects.filter(title__icontains=x)) 
    query = request.GET.get('q', '') 
    product_results = list(set(product_results)) 
    category_results = list(set(category_results)) 
    return render_to_response('search_results.html', {'query': query, 
                 'product_results': product_results, 
                 'category_results': category_results}) 
+0

아이 빠른 해킹하지 우아한 전혀 .... 썼습니다. 명성 – andyortlieb