@@ -30,7 +30,6 @@ class ArrayField(CheckFieldDefaultMixin, Field):
30
30
31
31
def __init__ (self , base_field , size = None , ** kwargs ):
32
32
self .base_field = base_field
33
- self .db_collation = getattr (self .base_field , "db_collation" , None )
34
33
self .size = size
35
34
if self .size :
36
35
self .default_validators = [
@@ -72,7 +71,6 @@ def check(self, **kwargs):
72
71
)
73
72
)
74
73
else :
75
- # Remove the field name checks as they are not needed here.
76
74
base_checks = self .base_field .check ()
77
75
if base_checks :
78
76
error_messages = "\n " .join (
@@ -114,17 +112,10 @@ def description(self):
114
112
def db_type (self , connection ):
115
113
return "array"
116
114
117
- def db_parameters (self , connection ):
118
- db_params = super ().db_parameters (connection )
119
- db_params ["collation" ] = self .db_collation
120
- return db_params
121
-
122
- def get_placeholder (self , value , compiler , connection ):
123
- return f"%s::{ self .db_type (connection )} "
124
-
125
115
def get_db_prep_value (self , value , connection , prepared = False ):
126
116
if isinstance (value , list | tuple ):
127
117
# Workaround for https://code.djangoproject.com/ticket/35982
118
+ # (fixed in Django 5.2).
128
119
if isinstance (self .base_field , DecimalField ):
129
120
return [self .base_field .get_db_prep_save (i , connection ) for i in value ]
130
121
return [self .base_field .get_db_prep_value (i , connection , prepared = False ) for i in value ]
@@ -144,7 +135,7 @@ def deconstruct(self):
144
135
145
136
def to_python (self , value ):
146
137
if isinstance (value , str ):
147
- # Assume we're deserializing
138
+ # Assume value is being deserialized,
148
139
vals = json .loads (value )
149
140
value = [self .base_field .to_python (val ) for val in vals ]
150
141
return value
@@ -236,9 +227,7 @@ def as_mql(self, compiler, connection):
236
227
237
228
class ArrayRHSMixin :
238
229
def __init__ (self , lhs , rhs ):
239
- # Don't wrap arrays that contains only None values, psycopg doesn't
240
- # allow this.
241
- if isinstance (rhs , tuple | list ) and any (self ._rhs_not_none_values (rhs )):
230
+ if isinstance (rhs , tuple | list ):
242
231
expressions = []
243
232
for value in rhs :
244
233
if not hasattr (value , "resolve_expression" ):
@@ -248,13 +237,6 @@ def __init__(self, lhs, rhs):
248
237
rhs = Array (* expressions )
249
238
super ().__init__ (lhs , rhs )
250
239
251
- def _rhs_not_none_values (self , rhs ):
252
- for x in rhs :
253
- if isinstance (x , list | tuple ):
254
- yield from self ._rhs_not_none_values (x )
255
- elif x is not None :
256
- yield True
257
-
258
240
259
241
@ArrayField .register_lookup
260
242
class ArrayContains (ArrayRHSMixin , FieldGetDbPrepValueMixin , Lookup ):
@@ -298,8 +280,7 @@ def get_prep_lookup(self):
298
280
values = super ().get_prep_lookup ()
299
281
if hasattr (values , "resolve_expression" ):
300
282
return values
301
- # In.process_rhs() expects values to be hashable, so convert lists
302
- # to tuples.
283
+ # process_rhs() expects hashable values, so convert lists to tuples.
303
284
prepared_values = []
304
285
for value in values :
305
286
if hasattr (value , "resolve_expression" ):
0 commit comments