python / expert
Snippet
Erweiterung von ORM-Abfragen durch benutzerdefinierte Postgres JSONB Array Lookups
Durch Unterklassenbildung von Djangos Lookup-Klasse können Entwickler rohe Datenbank-Operatoren wie PostgreSQL ?| direkt in die ORM-Filtersyntax von Querysets integrieren.
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 Fieldclass JSONHasAnyKey(Lookup):lookup_name = 'has_any_key'def as_sql(self, compiler, connection):lhs_sql, lhs_params = compiler.compile(self.lhs)rhs_sql, rhs_params = compiler.compile(self.rhs)return f'{lhs_sql} ?| {rhs_sql}', lhs_params + rhs_paramsField.register_lookup(JSONHasAnyKey)
django
Erklärung
1
class JSONHasAnyKey(Lookup):
Unterklasse des internen Lookup-Objekts von Django zur Ausdrückung von SQL-Transformationen.
2
lookup_name = 'has_any_key'
Bestimmt den Suffix-Namen des Feld-Lookups in ORM-Filteraufrufen (z. B. feld__has_any_key).
3
def as_sql(self, compiler, connection):
Kompiliert linke Feld-Seite und rechte Parameter-Seite in PostgreSQL ?| Operator-SQL.
4
Field.register_lookup(JSONHasAnyKey)
Registriert den benutzerdefinierten Lookup global auf der Basis-Field-Klasse.