Skip to content

Commit 9e097d2

Browse files
committed
Add lenght validator
1 parent 54a3c5e commit 9e097d2

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

django_mongodb_backend/fields/array.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from ..forms import SimpleArrayField
1111
from ..query_utils import process_lhs, process_rhs
1212
from ..utils import prefix_validation_error
13+
from .validators import LengthValidator
1314

1415
__all__ = ["ArrayField"]
1516

@@ -27,14 +28,23 @@ class ArrayField(CheckFieldDefaultMixin, Field):
2728
}
2829
_default_hint = ("list", "[]")
2930

30-
def __init__(self, base_field, size=None, **kwargs):
31+
def __init__(self, base_field, size=None, fixed_size=None, **kwargs):
3132
self.base_field = base_field
3233
self.size = size
34+
self.fixed_size = fixed_size
35+
if fixed_size and size:
36+
raise ValueError("Cannot define both, size and fixed_size")
37+
3338
if self.size:
3439
self.default_validators = [
3540
*self.default_validators,
3641
ArrayMaxLengthValidator(self.size),
3742
]
43+
if self.fixed_size:
44+
self.default_validators = [
45+
*self.default_validators,
46+
LengthValidator(self.fixed_size),
47+
]
3848
# For performance, only add a from_db_value() method if the base field
3949
# implements it.
4050
if hasattr(self.base_field, "from_db_value"):
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from django.core.validators import BaseValidator
2+
from django.utils.deconstruct import deconstructible
3+
from django.utils.translation import ngettext_lazy
4+
5+
6+
@deconstructible
7+
class LengthValidator(BaseValidator):
8+
message = ngettext_lazy(
9+
"List contains %(show_value)d item, it should contain %(limit_value)d.",
10+
"List contains %(show_value)d items, it should contain %(limit_value)d.",
11+
"show_value",
12+
)
13+
code = "length"
14+
15+
def compare(self, a, b):
16+
return a == b
17+
18+
def clean(self, x):
19+
return len(x)

0 commit comments

Comments
 (0)