views:

654

answers:

2

I have a MultipleChoiceField on a form holding car makes. I want to filter my database of cars to the makes that were checked but this causes a problem. How do I get all the Q(make=...) statements in dynamically?

How I start: ['value1', 'value2', ...]

How I want to end: Q(col='value1') | Q(col='value2') | ...

I've couple of other methods. I've tried appending querysets for each make and doing it the other way around (doing multiple excludes) but they were both really slow.

+3  A: 

Have you tried: Model.objects.filter(make__in=list_of_makes) ?

The list_of_makes is what is returned by the MultipleChoiceField

See the query set reference about the __in operator.

Ber
That is witchy magic!
Oli
+1  A: 

There was another method provided in #django:

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

Ber's method is great for this instance but if you need to filter on dynamic columns, mapping looks like the next cleanest way.

Oli
You can use the __in operator here also, if you dynamically construct the arguments: query={'%s__in'%col_name: list_of_values} Model.objects.filter(**query)using keyword arg expansion
Ber
I think, that map in that case should be replaced by reduce.
xaralis