python / intermediate
Snippet
Dynamische Abfragefilter-Komposition mit Q-Objekten und Reduce
Anstatt ODER-Bedingungen in Django-Abfragen fest zu verdrahten, ermöglicht die Kombination von Q-Objekten mit functools.reduce das programmgesteuerte Erstellen komplexer dynamischer Suchfilter. operator.or_ fungiert als logischer bitweiser ODER-Operator, um Listenelemente sauber zu verknüpfen.
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
Erklärung
1
queries = [Q(title__icontains=word) | Q(content__icontains=word) for word in keywords]
Erstellt eine Liste von Q-Objekten, die Suchbedingungen für jedes Schlüsselwort repräsentieren.
2
combined_query = reduce(operator.or_, queries)
Verknüpft alle Q-Objekte dynamisch zu einer einzigen ODER-Abfrage mittels Pythons reduce-Funktion.
3
return Article.objects.filter(combined_query)
Filtert das Article-QuerySet mit der dynamisch generierten zusammengesetzten Bedingung.