Commit e8fac28d by Tom Christie

Merge pull request #1818 from tituomin/serializer-subclass-mapping

Better mapping for custom model fields to serializer fields.
parents 5bbfef36 e4375202
......@@ -625,6 +625,20 @@ class ModelSerializerOptions(SerializerOptions):
self.write_only_fields = getattr(meta, 'write_only_fields', ())
def _get_class_mapping(mapping, obj):
"""
Takes a dictionary with classes as keys, and an object.
Traverses the object's inheritance hierarchy in method
resolution order, and returns the first matching value
from the dictionary or None.
"""
return next(
(mapping[cls] for cls in inspect.getmro(obj.__class__) if cls in mapping),
None
)
class ModelSerializer(Serializer):
"""
A serializer that deals with model instances and querysets.
......@@ -899,15 +913,17 @@ class ModelSerializer(Serializer):
models.URLField: ['max_length'],
}
if model_field.__class__ in attribute_dict:
attributes = attribute_dict[model_field.__class__]
attributes = _get_class_mapping(attribute_dict, model_field)
if attributes:
for attribute in attributes:
kwargs.update({attribute: getattr(model_field, attribute)})
try:
return self.field_mapping[model_field.__class__](**kwargs)
except KeyError:
return ModelField(model_field=model_field, **kwargs)
serializer_field_class = _get_class_mapping(
self.field_mapping, model_field)
if serializer_field_class:
return serializer_field_class(**kwargs)
return ModelField(model_field=model_field, **kwargs)
def get_validation_exclusions(self, instance=None):
"""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment