@ -16,87 +16,40 @@
import django
from django . db . models import Transform , TextField , DateField
from django . db . models import Transform , CharField , DateField
from django . db . models . functions import Lower
from django . contrib . postgres . fields import jsonb
try :
from django . contrib. postgres . fields . jsonb import KeyTransform , KeyTransformTextLookupMixin
from django . db. models . fields . json import KeyTransform , KeyTransformTextLookupMixin
except ImportError :
# backport from Django 2.x
class KeyTransform ( Transform ) :
operator = ' -> '
nested_operator = ' #> '
def __init__ ( self , key_name , * args , * * kwargs ) :
super ( KeyTransform , self ) . __init__ ( * args , * * kwargs )
self . key_name = key_name
def as_sql ( self , compiler , connection ) :
key_transforms = [ self . key_name ]
previous = self . lhs
while isinstance ( previous , KeyTransform ) :
key_transforms . insert ( 0 , previous . key_name )
previous = previous . lhs
lhs , params = compiler . compile ( previous )
if len ( key_transforms ) > 1 :
return " ( %s %s %% s) " % ( lhs , self . nested_operator ) , [ key_transforms ] + params
try :
int ( self . key_name )
except ValueError :
lookup = " ' %s ' " % self . key_name
else :
lookup = " %s " % self . key_name
return " ( %s %s %s ) " % ( lhs , self . operator , lookup ) , params
jsonb . KeyTransform = KeyTransform
class KeyTextTransform ( KeyTransform ) :
operator = ' ->> '
nested_operator = ' #>> '
_output_field = TextField ( )
class KeyTransformTextLookupMixin ( object ) :
"""
Mixin for combining with a lookup expecting a text lhs from a JSONField
key lookup . Make use of the - >> operator instead of casting key values to
text and performing the lookup on the resulting representation .
"""
def __init__ ( self , key_transform , * args , * * kwargs ) :
assert isinstance ( key_transform , KeyTransform )
key_text_transform = KeyTextTransform (
key_transform . key_name , * key_transform . source_expressions , * * key_transform . extra
)
super ( KeyTransformTextLookupMixin , self ) . __init__ ( key_text_transform , * args , * * kwargs )
class Lower ( Transform ) :
lookup_name = ' lower '
function = ' LOWER '
TextField . register_lookup ( Lower )
from django . contrib . postgres . fields . jsonb import KeyTransform , KeyTransformTextLookupMixin
class Unaccent ( Transform ) :
lookup_name = ' unaccent '
function = ' immutable_unaccent '
output_field = CharField ( )
Text Field. register_lookup ( Unaccent )
CharField . register_lookup ( Unaccent )
CharField . register_lookup ( Lower )
class Normalize ( Transform ) :
lookup_name = ' normalize '
function = ' immutable_normalize '
output_field = CharField ( )
Text Field. register_lookup ( Normalize )
CharField . register_lookup ( Normalize )
class Date ( Transform ) :
lookup_name = ' timestamp '
function = ' immutable_date '
_ output_field = DateField ( )
output_field = DateField ( )
Text Field. register_lookup ( Date )
CharField . register_lookup ( Date )
class JSONUnaccent ( KeyTransformTextLookupMixin , Unaccent ) :