python / expert
Snippet
Benutzerdefinierte Lookup-Unterklasse für Postgres-Array-Überlappungsabfragen
Djangos ORM kann durch Unterklassenbildung von Lookup und Implementierung von `as_sql` um benutzerdefinierte Operatoren erweitert werden. Die Registrierung von `ArrayOverlapLookup` ermöglicht die Verwendung des PostgreSQL-Überlappungsoperators `&&` in QuerySet-Filtern für Array-Felder.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
from django.db.models import Lookupfrom django.db.models.fields import Field@Field.register_lookupclass ArrayOverlapLookup(Lookup):lookup_name = 'overlap'def as_sql(self, compiler, connection):lhs, lhs_params = self.process_lhs(compiler, connection)rhs, rhs_params = self.process_rhs(compiler, connection)params = lhs_params + rhs_paramsreturn f"{lhs} && {rhs}", params
django
Erklärung
1
@Field.register_lookup
Registriert die benutzerdefinierte Lookup-Klasse global für Django-Modellfelder.
2
class ArrayOverlapLookup(Lookup):
Erbt von Djangos Basis-Lookup zur Kapselung der SQL-Übersetzung für Feldvergleiche.
3
lookup_name = 'overlap'
Definiert das Schlüsselwort für Abfragen (z.B. tags__overlap=[1, 2]).
4
def as_sql(self, compiler, connection):
Überschreibt die SQL-Kompilierungsmethode zur Rückgabe nativer Datenbank-Syntax und Parameter.
5
lhs, lhs_params = self.process_lhs(compiler, connection)
Kompiliert den linken Ausdruck in einen SQL-String und gebundene Parameter.
6
rhs, rhs_params = self.process_rhs(compiler, connection)
Kompiliert das rechte Argument in seine SQL-Repräsentation und Parameter.
7
return f"{lhs} && {rhs}", params
Kombiniert kompilierte Ausdrücke in die PostgreSQL-Array-Überlappungssyntax.