Как выразить «или» в словаре запроса в Django - PullRequest
1 голос
/ 03 августа 2010

Я фильтрую большое количество пользователей по атрибутам.Например, они могут быть отфильтрованы по минимальному значению gpa.

До сих пор я делал следующее, чтобы создать свой набор запросов-

(«gpa_gt» просто означает, что свойство gpa должно бытьбольше, чем любой параметр запроса)

    if len(request.GET) != 0:
        kwargs = {}
        if request.GET['mingpa']:
            kwargs['gpa__gt'] = request.GET['mingpa']
    profiles = BlahUser.objects.filter(**kwargs)

Теперь у пользователей есть основной атрибут первой школы и второй основной атрибут школы.Если я фильтрую по мажору, я хочу, чтобы пользователь отображался в результатах, если его первый мажор ИЛИ его второй мажор соответствуют любому из моих выборов (я использую множественный выбор при фильтрации).То, что у меня сейчас работает, работает только для одного мажора -

    if request.GET.has_key('major'):
            kwargs['major__in'] = request.GET.getlist('major')

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

Ответы [ 3 ]

3 голосов
/ 03 августа 2010

Вы включительно or в наборах запросов Django с объектом Q :

Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who')

Вы можете работать с ними как с переменными, поэтому вам нужно что-то вроде этого:

query = Q( gpa__gt=request.GET['mingpa'] )
if request.GET.has_key('major'):
    query = query | Q( major__in=request.GET.getlist('major') )
profiles = BlahUser.objects.get( query )
2 голосов
/ 03 августа 2010

Боргар определенно на правильном пути, но я думаю, что это немного ближе к тому, что вы ищу:

# filter for minimum GPA
gpa_filter = Q( gpa__gt=request.GET['mingpa'] )
major_filter = Q()

if request.GET.has_key('major'):
    majors = request.GET.getlist('major')
    # filter for students with first OR second major in specified majors
    major_filter = Q( first_major__in=majors| Q(second_major__in=majors)

# run filter (these are AND'ed together), so we get students that:
# 1. Have a first or second major in the specified list of majors AND
# 2. Have a GPA above the specified minimum
profiles = BlahUser.objects.get( gpa_filter, major_filter )

Обратите внимание, что вы можете продолжать использовать profiles в качестве обычного набора запросов (как в этом надуманном примере):

seniors_matching_request_params = profiles.filter(status='senior')

Итак, просто используйте объекты Q там, где вам нужно, а затем продолжайте работать с набором запросов в обычном режиме.

0 голосов
/ 03 августа 2010

Я думаю об этом до сих пор - (конечно, основной)

     if request.GET.has_key('course'):
            extra = ['Q(first_course IN ' + request.GET.getlist('course') + ') | Q(second_course IN ' + request.GET.getlist('course') + ')']
            profiles = sumaConnectUser.objects.extra(where=[extra])

«Курс» - это то, что мы называем майором. Я не проверял, работает ли вышеуказанное, но это начало ..

Помощь? лол

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