2008-12-09 3 views
4

У меня есть MultipleChoiceField на форме холдинга. Я хочу отфильтровать мою базу данных автомобилей, которые были проверены, но это создает проблему. Как я могу получить все операторы Q(make=...) динамически?Django dynamic OR запросы

Как я: ['value1', 'value2', ...]

Как я хочу закончить: Q(col='value1') | Q(col='value2') | ...

Я несколько других методов. Я пробовал добавлять запросы для каждого make и делал это наоборот (делаю несколько исключений), но они оба были очень медленными.

ответ

6

Вы пытались: Model.objects.filter(make__in=list_of_makes)?

В list_of_makes что возвращается в MultipleChoiceField

См the query set reference об операторе __in.

+0

Это колдовская магия! – Oli 2008-12-09 09:45:55

4

Был еще один способ, предоставляемый в #django:

reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...]) 

Ber's method велик для этого экземпляра, но если вам нужно фильтровать на динамических столбцах, отображение выглядит следующий чистейшим образом.

+0

Вы можете использовать оператор __in здесь также, если вы динамически построить аргументы: запрос = { '% s__in' % col_name: list_of_values} Model.objects.filter (** запросов) с помощью расширения ключевых слов ARG – Ber 2008-12-09 11:42:22

3

Я попытался ответить Оли, но он не работает, даже уменьшить(), так как появляется объекты Q не принимают словари в качестве аргумента:

Вот как у меня было это работает:

# These are the fields I want to search with an OR clause 
search_fields = ['title__icontains', 'publisher__name__icontains', 'authors__name__icontains'] 

search = 'search string' 
clauses = [] 
for item in search_fields: 
    clauses.append(queryset.filter(**{item: search})) 
    queryset = reduce(lambda x, y: x | y, clauses).distinct() 

Проверьте проблемы с производительностью, так как я мог тестировать только небольшой набор данных.