python / expert
Snippet
Benutzerdefinierte Expression-Unterklassenbildung für komplexe Datentyp-Konvertierungen
Das direkte Unterdefinieren von `Expression` ermöglicht das Erstellen von AST-Knoten für Djangos QueryCompiler. Die Implementierung von `resolve_expression` ermöglicht eine rekursive Ausdrucksauflösung über komplexe Modell-Joins hinweg, während die SQL-Kompilierung in `as_sql` für Datentyp-Konvertierungen angepasst wird.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.db.models import Expression, FloatFieldclass BitwiseCastExpression(Expression):def __init__(self, expression, target_type='float8'):super().__init__(output_field=FloatField())self.expression = expressionself.target_type = target_typedef resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False):c = self.copy()c.is_summary = summarizec.expression = self.expression.resolve_expression(query, allow_joins, reuse, summarize)return cdef as_sql(self, compiler, connection):sql, params = compiler.compile(self.expression)return f"CAST({sql} AS {self.target_type})", params
django
Erklärung
1
from django.db.models import Expression, FloatField
Importiert die Basis-Klasse für Abfrage-Ausdrucksknoten und die FloatField-Ausgabe-Darstellung.
2
class BitwiseCastExpression(Expression):
Definiert einen benutzerdefinierten Low-Level-ORM-Ausdrucksknoten für Datenbank-Casting.
3
def __init__(self, expression, target_type='float8'):
Speichert den umschlossenen inneren Abfrage-Ausdruck und den Ziel-Datenbanktyp für das Casting.
4
super().__init__(output_field=FloatField())
Initialisiert die Basis-Expression und konfiguriert die Django-Feld-Ausgabetyp-Darstellung.
5
def resolve_expression(self, query=None, allow_joins=True, reuse=None, summarize=False):
Überschreibt die AST-Knoten-Auflösungsmethode, die bei der Verarbeitung von ORM-Abfragen erforderlich ist.
6
c.expression = self.expression.resolve_expression(query, allow_joins, reuse, summarize)
Löst den untergeordneten inneren Ausdruck vor der SQL-Generierung rekursiv auf.
7
def as_sql(self, compiler, connection):
Kompiliert den Ausdrucksknoten in eine Datenbank-SQL-Zeichenkette und eine Parameterliste.
8
return f"CAST({sql} AS {self.target_type})", params
Formatiert die SQL-CAST-Klausel unter Beibehaltung der Parameterbindungen des Abfrage-Kompilers.