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 回答