1
1
import json
2
2
3
- from django .contrib .postgres .validators import ArrayMaxLengthValidator
4
3
from django .core import checks , exceptions
5
4
from django .db .models import DecimalField , Field , Func , IntegerField , Transform , Value
6
5
from django .db .models .fields .mixins import CheckFieldDefaultMixin
10
9
from ..forms import SimpleArrayField
11
10
from ..query_utils import process_lhs , process_rhs
12
11
from ..utils import prefix_validation_error
12
+ from ..validators import ArrayMaxLengthValidator , LengthValidator
13
13
14
14
__all__ = ["ArrayField" ]
15
15
@@ -27,14 +27,20 @@ class ArrayField(CheckFieldDefaultMixin, Field):
27
27
}
28
28
_default_hint = ("list" , "[]" )
29
29
30
- def __init__ (self , base_field , max_size = None , ** kwargs ):
30
+ def __init__ (self , base_field , max_size = None , size = None , ** kwargs ):
31
31
self .base_field = base_field
32
32
self .max_size = max_size
33
+ self .size = size
33
34
if self .max_size :
34
35
self .default_validators = [
35
36
* self .default_validators ,
36
37
ArrayMaxLengthValidator (self .max_size ),
37
38
]
39
+ if self .size :
40
+ self .default_validators = [
41
+ * self .default_validators ,
42
+ LengthValidator (self .size ),
43
+ ]
38
44
# For performance, only add a from_db_value() method if the base field
39
45
# implements it.
40
46
if hasattr (self .base_field , "from_db_value" ):
@@ -98,6 +104,14 @@ def check(self, **kwargs):
98
104
id = "django_mongodb_backend.array.W004" ,
99
105
)
100
106
)
107
+ if self .size and self .max_size :
108
+ errors .append (
109
+ checks .Error (
110
+ "ArrayField cannot have both size and max_size." ,
111
+ obj = self ,
112
+ id = "django_mongodb_backend.array.E003" ,
113
+ )
114
+ )
101
115
return errors
102
116
103
117
def set_attributes_from_name (self , name ):
@@ -127,6 +141,8 @@ def deconstruct(self):
127
141
kwargs ["base_field" ] = self .base_field .clone ()
128
142
if self .max_size is not None :
129
143
kwargs ["max_size" ] = self .max_size
144
+ if self .size is not None :
145
+ kwargs ["size" ] = self .size
130
146
return name , path , args , kwargs
131
147
132
148
def to_python (self , value ):
@@ -211,6 +227,7 @@ def formfield(self, **kwargs):
211
227
"form_class" : SimpleArrayField ,
212
228
"base_field" : self .base_field .formfield (),
213
229
"max_length" : self .max_size ,
230
+ "length" : self .size ,
214
231
** kwargs ,
215
232
}
216
233
)
0 commit comments