@@ -61,9 +61,10 @@ def get_attribute(obj, attrs):
6161
6262
6363class BaseField (object ):
64- def __init__ (self , source = None , default = undefined ):
64+ def __init__ (self , source = None , default = undefined , required = True ):
6565 self .source = source
6666 self .default = default
67+ self .required = required
6768
6869 def bind (self , field_name , adapter ):
6970 if field_name == self .source :
@@ -88,10 +89,21 @@ def bind(self, field_name, adapter):
8889
8990 def get_attribute (self , obj ):
9091 value = get_attribute (obj , self .lookup_attrs )
91- if value is not undefined :
92- return value
92+ if value is undefined :
93+ if self .default is not undefined :
94+ return self .default
95+ elif self .required :
96+ raise ValueError ((
97+ "Required value not found for field "
98+ "`{adapter_name}.{field_name}`. Provide a default value."
99+ ).format (
100+ adapter_name = self .adapter .__class__ .__name__ ,
101+ field_name = self .field_name ,
102+ ))
103+ else :
104+ return undefined
93105 else :
94- return self . default
106+ return value
95107
96108 def adapt (self , data ):
97109 return data
@@ -143,6 +155,8 @@ def adapt(self, data=None):
143155 obj = model_cls ()
144156 for field_name , field in self .fields .iteritems ():
145157 value = field .get_attribute (data or self .data )
158+ if value is undefined :
159+ continue
146160 adapted_value = field .adapt (value )
147161 if isinstance (obj , collections .Mapping ):
148162 obj [field_name ] = adapted_value
0 commit comments