python / expert
Snippet
Benutzerdefinierte Django-Datenbank-Lookup-Transformation für PostgreSQL-Array-Slicing
Das Django ORM ermöglicht die Erweiterung von Feld-Lookup-Funktionen durch Unterklassenbildung von `Transform`. Durch Kompilieren des linken Ausdrucks (`lhs`) in `as_sql` können Sie native PostgreSQL-Array-Slicing-Operationen ausgeben und gleichzeitig die Parametersicherheit in SQL-Generierungspipelines wahren.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db.models import Transformfrom django.contrib.postgres.fields import ArrayFieldclass ArraySliceTransform(Transform):lookup_name = 'slice'def __init__(self, expression, start=1, end=3, **extra):super().__init__(expression, **extra)self.start = startself.end = enddef as_sql(self, compiler, connection):lhs, params = compiler.compile(self.lhs)return f"{lhs}[{self.start}:{self.end}]", paramsArrayField.register_lookup(ArraySliceTransform)
django
Erklärung
1
from django.db.models import Transform
Importiert die Basis-Transform-Klasse, mit der Datenbankabfrage-Ausdrücke vor der SQL-Auswertung geändert werden.
2
class ArraySliceTransform(Transform):
Deklariert eine benutzerdefinierte SQL-Lookup-Transformation für Listen- und Array-Ausdrücke.
3
lookup_name = 'slice'
Definiert das Lookup-Schlüsselwort für Django ORM-Filteraufrufe (z.B. field__slice).
4
def __init__(self, expression, start=1, end=3, **extra):
Initialisiert die Transformation und speichert die Slicing-Grenzen.
5
def as_sql(self, compiler, connection):
Überschreibt die SQL-Kompilierungsmethode, um benutzerdefinierte Datenbank-Syntax zu erzeugen.
6
lhs, params = compiler.compile(self.lhs)
Kompiliert den zugrundeliegenden Feld-Spaltenausdruck in parametrisiertes SQL.
7
return f"{lhs}[{self.start}:{self.end}]", params
Gibt das PostgreSQL-Array-Slice-Operatorformat zusammen mit den Abfrageparametern zurück.
8
ArrayField.register_lookup(ArraySliceTransform)
Registriert die benutzerdefinierte Slice-Transformation für Djangos PostgreSQL ArrayField-Klasse.