Запрос без учета регистра, который поддерживает несколько поисковых слов - PullRequest
0 голосов
/ 09 июля 2010

Я пытаюсь выполнить запрос без учета регистра. Я бы обычно использовал __icontains, но поскольку он не поддерживает метод .split (), я застрял на использовании __in вместо этого:

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())

Моя проблема в том, что поля объекта обычно имеют заглавную первую букву, поэтому запрос в нижнем регистре всегда возвращает отрицательное значение.

В любом случае вокруг этого?

Ответы [ 2 ]

1 голос
/ 09 июля 2010

спасибо, что поделился, я написал этот быстрый взлом, совсем не элегантный ....

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})
1 голос
/ 09 июля 2010

Я решил эту проблему, используя exec для генерации кода из строки, используя icontains вместо in. Я признаю, что это небрежно и не элегантно, и его следует проверять на предмет безопасности, но это сработало.untested / pseudocode:

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, который немного упрощает динамические запросы такого типа, поскольку объект "or" принимает список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...