build_field, build_final_kwargs

This commit is contained in:
Tom Christie 2014-12-19 15:09:57 +00:00
parent 94883ae7cd
commit f72928ea98

View File

@ -908,7 +908,22 @@ class ModelSerializer(Serializer):
ret[field_name] = declared_fields[field_name]
continue
elif field_name in info.fields_and_pk:
# Determine the serializer field class and keyword arguments.
field_cls, kwargs = self.build_field(field_name, info, model, depth)
# Populate any kwargs defined in `Meta.extra_kwargs`
kwargs = self.build_final_kwargs(kwargs, extra_kwargs, field_name)
# Create the serializer field.
ret[field_name] = field_cls(**kwargs)
# Add in any hidden fields.
ret.update(hidden_fields)
return ret
def build_field(self, field_name, info, model, depth):
if field_name in info.fields_and_pk:
# Create regular model fields.
model_field = info.fields_and_pk[field_name]
field_cls = self._field_mapping[model_field]
@ -955,8 +970,15 @@ class ModelSerializer(Serializer):
(field_name, model.__class__.__name__)
)
# Populate any kwargs defined in `Meta.extra_kwargs`
return field_cls, kwargs
def build_final_kwargs(self, kwargs, extra_kwargs, field_name):
"""
Include an 'extra_kwargs' that have been included for this field,
possibly removing any incompatible existing keyword arguments.
"""
extras = extra_kwargs.get(field_name, {})
if extras.get('read_only', False):
for attr in [
'required', 'default', 'allow_blank', 'allow_null',
@ -970,12 +992,7 @@ class ModelSerializer(Serializer):
kwargs.update(extras)
# Create the serializer field.
ret[field_name] = field_cls(**kwargs)
ret.update(hidden_fields)
return ret
return kwargs
def _get_model_fields(self, field_names, declared_fields, extra_kwargs):
"""