python / intermediate
Snippet
Dynamic Query Filter Composition using Q Objects and Reduce
Instead of hardcoding OR conditions in Django queries, combining Q objects with functools.reduce allows building complex dynamic search filters programmatically. operator.or_ acts as the logical bitwise OR operator to join list elements cleanly.
snippet.py
python
1
2
3
4
5
6
7
8
9
import operatorfrom functools import reducefrom django.db.models import Qfrom myapp.models import Articledef search_articles(keywords):queries = [Q(title__icontains=word) | Q(content__icontains=word) for word in keywords]combined_query = reduce(operator.or_, queries)return Article.objects.filter(combined_query)
django
Breakdown
1
queries = [Q(title__icontains=word) | Q(content__icontains=word) for word in keywords]
Constructs a list of Q objects representing matching conditions for each keyword.
2
combined_query = reduce(operator.or_, queries)
Combines all Q objects dynamically into a single OR query using Python's reduce function.
3
return Article.objects.filter(combined_query)
Filters the Article QuerySet with the dynamically generated composite condition.