python / expert
Snippet
Custom Django Database Lookup Transform for PostgreSQL Array Slicing
Django ORM allows extending field lookup capabilities by subclassing `Transform`. By compiling the left-hand expression (`lhs`) inside `as_sql`, you can emit native PostgreSQL array slicing operations while preserving parameter safety across SQL generation pipelines.
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
Breakdown
1
from django.db.models import Transform
Imports the base Transform class used to modify database query expressions before SQL evaluation.
2
class ArraySliceTransform(Transform):
Declares a custom SQL lookup transformation targeting list and array expressions.
3
lookup_name = 'slice'
Defines the string lookup keyword used inside Django ORM filter calls (e.g., field__slice).
4
def __init__(self, expression, start=1, end=3, **extra):
Initializes the transform storing slicing offset boundaries.
5
def as_sql(self, compiler, connection):
Overrides SQL compilation method to produce custom backend SQL syntax.
6
lhs, params = compiler.compile(self.lhs)
Compiles the underlying field column expression into parameterized SQL.
7
return f"{lhs}[{self.start}:{self.end}]", params
Returns raw PostgreSQL array slice operator format along with query parameters.
8
ArrayField.register_lookup(ArraySliceTransform)
Registers the custom slice transform onto Django's PostgreSQL ArrayField class.