Django Newbie здесь ... Есть ли хороший способ обработки пустых результатов MultipleChoiceField (например, в формате List-Comp?) - PullRequest
0 голосов
/ 04 марта 2010

Я натолкнулся на эту запись в блоге , которая описывает элегантный способ обработки результатов, возвращаемых из ChoiceField в представление, используя технику понимания списка - тот, который устраняет пустые ключи / значения без всех промежуточных структур данных. Этот конкретный подход, похоже, не работает для MultipeChoiceFields. Есть ли подобный способ подойти к ним? (Если, например, поля спальни и ванных комнат в следующем примере возвращают несколько значений).

Код выглядит следующим образом:

if search_form.is_valid():
            searchdict = search_form.cleaned_data
            # It's easier to store a dict of the possible lookups we want, where
            # the values are the keyword arguments for the actual query.
            qdict = { 'city': 'city__icontains',
                    'zip_code': 'zip_code',
                    'property_type': 'property_type_code',
                    'county': 'county__icontains',
                    'minimum_price': 'sale_price__gte',
                    'maximum_price': 'sale_price__lte',
                    'bedrooms': 'bedrooms__gte',
                    'bathrooms': 'baths_total__gte'}
            # Then we can do this all in one step instead of needing to call
            # 'filter' and deal with intermediate data structures.
            q_objs = [Q(**{qdict[k]: searchdict[k]}) for k in qdict.keys() if searchdict.get(k, None)]

Большое спасибо ... это потрясающее сообщество.

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Хм ... хитрый вопрос, проблема в том, что вы хотите, чтобы этот конкретный случай работал как многозначный, поэтому вы не можете использовать "нормальный" подход добавления фильтров.

Atleast ...Я предполагаю, что если кто-то выберет несколько ванных комнат, то это будет либо вместо обоих.

Это слишком много для одного вкладыша, я думаю, но это может сработать;)

import operator

create_qs = lambda k, vs: reduce(operator.or_, [Q(**{k: v}) for v in vs])
q_objs = [create_qs(k, searchdict.getlist(k)) for k in qdict.keys() if k in searchdict]
0 голосов
/ 04 марта 2010

Возможно, вы ищете поиск поля IN , например:

'bathrooms': 'baths_total__in',
...