Python Django - фильтр + содержит читаемый синтаксис - PullRequest
0 голосов
/ 16 мая 2011

Я создал маленький метод поиска.Проблема в том, что его трудно прочитать и упорядочить, кажется, «не в форме».Каков наилучший способ фильтрации запросов таким образом?

@login_check
def search(request):
    subdomain = request.get_host()                                                                   
    q = request.GET.get('q', None)
    queryset = (
                    SomeObject.objects.filter(title__icontains=q)
                        .filter(alias=Site.objects.get(domain=subdomain)) \
                        .order_by('created') |
                    SomeObject.objects.filter(description__icontains=q)
                        .filter(alias=Site.objects.get(domain=subdomain)) \
                        .order_by('created') |
                    SomeObject.objects.filter(comment__icontains=q)
                        .filter(alias=Site.objects.get(domain=subdomain)) \
                        .order_by('created') |
                    SomeObject.objects.filter(email__icontains=q)
                        .filter(alias=Site.objects.get(domain=subdomain)) \
                        .order_by('created')
                )
    return object_list(queryset)

В этом методе список объектов формирует то, что должно быть возвращено, поэтому все, что мне нужно сделать, это сформировать красивый запрос.

Основная проблема, которую я вижу здесь, заключается в том, что фильтры могут быть применены после contains, поскольку все они одинаковы.Как я могу достичь этого?Каков наилучший / лучший способ фильтрации в такой ситуации?

Я устал устанавливать фильтры после создания запроса, но потом выясняется, что я не могу применить фильтры к запросам только к спискам моделей.Я могу ошибаться, так как я пишу эту ошибку из памяти, но одна вещь наверняка, что она выдавала ошибку.

PS Я использую Django 1.1 здесь и python 2.5.

Ответы [ 2 ]

3 голосов
/ 16 мая 2011
1 голос
/ 16 мая 2011

Вы можете использовать понимание списка, чтобы выделить общий хвост:

queryset_list = (
    item.filter(alias=Site.objects.get(domain=subdomain)).order_by('created')
    for item in (
        SomeObject.objects.filter(title__icontains=q),
        SomeObject.objects.filter(description__icontains=q),
        SomeObject.objects.filter(comment__icontains=q),
        SomeObject.objects.filter(email__icontains=q)))
queryset = functools.reduce(operator.or_, queryset_list)
...