python / intermediate
Snippet
Bedingte QuerySet-Annotationen mit Case-When-Ausdrücken
Bedingte Ausdrücke in Django wie Case und When ermöglichen die Ausführung komplexer Logik direkt auf Datenbankebene. Das Verlagern bedingter Logik in SQL-Annotationen reduziert den Python-Speicherbedarf drastisch und verbessert die Leistung beim Ausführen von Abfragen.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import modelsfrom django.db.models import Case, When, Value, IntegerFieldclass OrderQuerySet(models.QuerySet):def with_priority_score(self):return self.annotate(priority_level=Case(When(is_express=True, total_amount__gte=500, then=Value(1)),When(is_express=True, total_amount__lt=500, then=Value(2)),When(is_express=False, total_amount__gte=500, then=Value(3)),default=Value(4),output_field=IntegerField()))
django
Erklärung
1
class OrderQuerySet(models.QuerySet):
Definiert eine benutzerdefinierte QuerySet-Unterklasse mit wiederverwendbaren domänenspezifischen Abfragemethoden.
2
priority_level=Case(
Wendet eine bedingte SQL-CASE-Anweisung an, um dynamische Felder pro Zeile in der Datenbank zu berechnen.
3
When(is_express=True, total_amount__gte=500, then=Value(1)),
Wertet eine Kombination von Kriterien aus und weist eine Rangfolge zu, wenn beide Bedingungen erfüllt sind.
4
output_field=IntegerField()
Gibt den Django-Modellfeld-Datentyp für die neu generierte Annotationsspalte explizit an.