Джанго Кросс фильтр Поиск? - PullRequest
0 голосов
/ 07 января 2012

Как мне создать запрос, который фильтрует такую ​​модель?

Моя модель:

class test(models.Model):
    name = models.CharField(max_length=50)
    status = models.CharField(max_length=50)
    other = models.CharField(max_length=50)

Мне бы хотелось, чтобы вместо ИЛИ я фильтровал запрос по AND.Я пытался изменить |к & но это не работает.Чтобы сделать его более сложным, если у меня есть фильтры в шаблоне в форме, такие как:

Filter By Name: DropDownList of Names
Filter By Status: DropDownList of Statuses
Filter By Other: DropDownList of Others

Если я выберу name1, status1 и other1 из выпадающих списков, он должен отображать результаты:

results = test.objects.filter(name=name1,status=status1,other=other1)

Вот мой текущий запрос в views.py:

def search(request):
    query = request.GET.get('q', '')
    if query:
        qset = (
            Q(name__icontains=query) |
            Q(status__icontains=query) |
            Q(other__icontains=query)
        )
        results = test.objects.filter(qset).distinct()
    else:
        results = []
    return render_to_response("test/search.html", {
        "results": results,
        "query": query
    })

В данный момент он ищет только имя, статус или другое.Если я изменю |to & выполняет поиск всех из них, но при отображении результатов ничего не отображается, поскольку обработка запросов из раскрывающихся списков формы не связана.Как их связать?Как также использовать опцию ALL для раскрывающихся списков для определенного поля?

Надеюсь, я это прояснил.Спасибо.

1 Ответ

2 голосов
/ 09 января 2012

Рекомендую посмотреть django-filters приложение.Он может автоматизировать все процедуры с помощью раскрывающихся списков форм и создания наборов запросов с помощью запроса поиска / фильтрации:

Django-фильтр - это повторно используемое приложение Django, позволяющее пользователям динамически фильтровать набор запросов.Требуется Python 2.4 или выше.Инструкции по использованию и установке см. В каталоге docs.

Django-фильтр можно использовать для создания интерфейсов, аналогичных интерфейсу list_filter администратора Django.Он имеет API, очень похожий на Django ModelForms.Например, если бы у вас была модель Product, вы могли бы иметь для нее набор фильтров с кодом ::

import django_filters

class ProductFilterSet(django_filters.FilterSet):
    class Meta:
        model = Product
        fields = ['name', 'price', 'manufacturer']

И тогда, на ваш взгляд, вы могли бы сделать: *

def product_list(request):
    filterset = ProductFilterSet(request.GET or None)
    return render_to_response('product/product_list.html',
        {'filterset': filterset})

См.каталог документов для получения дополнительной информации.

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