1010class Field (property ):
1111 """Base field."""
1212
13- def __init__ (self , default = None ):
13+ def __init__ (self , default = None , required = False ):
1414 """Initializer."""
1515 super (Field , self ).__init__ (self .get_value , self .set_value )
1616 self .name = None
@@ -19,6 +19,7 @@ def __init__(self, default=None):
1919 self .model_cls = None
2020
2121 self .default = default
22+ self .required = required
2223
2324 def bind_name (self , name ):
2425 """Bind field to its name in model class."""
@@ -40,8 +41,12 @@ def bind_model_cls(self, model_cls):
4041
4142 def init_model (self , model , value ):
4243 """Init model with field."""
43- if not value :
44+ if value is None :
4445 value = self .default () if callable (self .default ) else self .default
46+
47+ if value is None and self .required :
48+ raise AttributeError ("This field is required." )
49+
4550 setattr (model , self .storage_name , value )
4651
4752 def get_value (self , model ):
@@ -50,6 +55,9 @@ def get_value(self, model):
5055
5156 def set_value (self , model , value ):
5257 """Set field's value."""
58+ if value is None and self .required :
59+ raise AttributeError ("This field is required." )
60+
5361 if value is not None :
5462 value = self ._converter (value )
5563 setattr (model , self .storage_name , value )
@@ -122,9 +130,9 @@ def _converter(self, value):
122130class Model (Field ):
123131 """Model relation field."""
124132
125- def __init__ (self , related_model_cls , default = None ):
133+ def __init__ (self , related_model_cls , default = None , required = False ):
126134 """Initializer."""
127- super (Model , self ).__init__ (default = default )
135+ super (Model , self ).__init__ (default = default , required = required )
128136
129137 self .related_model_cls = related_model_cls
130138
@@ -140,9 +148,9 @@ def _converter(self, value):
140148class Collection (Field ):
141149 """Models collection relation field."""
142150
143- def __init__ (self , related_model_cls , default = None ):
151+ def __init__ (self , related_model_cls , default = None , required = False ):
144152 """Initializer."""
145- super (Collection , self ).__init__ (default = default )
153+ super (Collection , self ).__init__ (default = default , required = required )
146154 self .related_model_cls = related_model_cls
147155
148156 def _converter (self , value ):
0 commit comments