Reputation: 12423
this code works well
from django.db.models import Q
filtered = Article.objects.filter(Q(authers__id=2) | Q(issues__id=1) | Q(issues__id=3) )
However now I have list like this below, and want to make filter dynamically.
ids = [1,2,3]
for id in ids:
eachQ = Q(authers__id=isId)
#then......
how can I make query ???
Upvotes: 1
Views: 86
Reputation: 2627
Querying same field for different values(or condition) you can use __in key.
possibilities = [1,2,3]
Article.objects.filter(field__in=posibilities)
Also for dynamic queries you can pass **kwargs to filter method:
query_key = 'your_field_name__in'
Article.objects.filter(**{query_key:[1,2,3]#your search value})
You can add your multiple model field into kwargs param:
query = {'field_1':value_1,'field_2':value_2,'field_3__contains':value_3}#for example
Article.objects.filter(**query)
Upvotes: 1
Reputation: 568
If you have a list of values for just one field, it`s better to use 'in' filter:
ids = [1,2,3]
articles = Article.objects.filter(authers__id__in=ids)
Otherwise, for creating 'OR' filter iteratively:
from django.db.models import Q
filters = Q()
ids = [1, 2, 3]
for pk in ids:
filters |= Q(authers__id=pk)
articles = Article.objects.filter(filters)
This can be used for dynamic filtering by multiple model fields and values.
Upvotes: 1