0

このブログエントリに出くわしたのは、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)]

どうもありがとうございました...これは素晴らしいコミュニティです。

4

2 に答える 2

1

うーん...トリッキーな問題です。問題は、その特定のケースのみを多値として機能させたいため、フィルターを追加する「通常の」アプローチを使用できないことです。

少なくとも...誰かが複数のバスルームを選択した場合、両方ではなくどちらかになると思います。

これはワンライナーには多すぎると思いますが、うまくいきます;)

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]
于 2010-03-04T01:20:59.327 に答える
0

次のようなINフィールド ルックアップを探している可能性があります。

'bathrooms': 'baths_total__in',
于 2010-03-04T01:20:04.063 に答える