mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-23 15:54:16 +03:00
Add utility function to match classes in dictionary.
This commit is contained in:
parent
ae84b8b0e8
commit
582f6fdd4b
|
@ -625,6 +625,21 @@ class ModelSerializerOptions(SerializerOptions):
|
||||||
self.write_only_fields = getattr(meta, 'write_only_fields', ())
|
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.
|
||||||
|
|
||||||
|
"""
|
||||||
|
for baseclass in inspect.getmro(obj.__class__):
|
||||||
|
val = mapping.get(baseclass)
|
||||||
|
if val:
|
||||||
|
return val
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class ModelSerializer(Serializer):
|
class ModelSerializer(Serializer):
|
||||||
"""
|
"""
|
||||||
A serializer that deals with model instances and querysets.
|
A serializer that deals with model instances and querysets.
|
||||||
|
@ -899,15 +914,16 @@ class ModelSerializer(Serializer):
|
||||||
models.URLField: ['max_length'],
|
models.URLField: ['max_length'],
|
||||||
}
|
}
|
||||||
|
|
||||||
if model_field.__class__ in attribute_dict:
|
attributes = _get_class_mapping(attribute_dict, model_field)
|
||||||
attributes = attribute_dict[model_field.__class__]
|
if attributes:
|
||||||
for attribute in attributes:
|
for attribute in attributes:
|
||||||
kwargs.update({attribute: getattr(model_field, attribute)})
|
kwargs.update({attribute: getattr(model_field, attribute)})
|
||||||
|
|
||||||
for model_field_baseclass in inspect.getmro(model_field.__class__):
|
serializer_field_class = _get_class_mapping(
|
||||||
serializer_field_class = self.field_mapping.get(model_field_baseclass)
|
self.field_mapping, model_field)
|
||||||
if serializer_field_class:
|
|
||||||
return serializer_field_class(**kwargs)
|
if serializer_field_class:
|
||||||
|
return serializer_field_class(**kwargs)
|
||||||
return ModelField(model_field=model_field, **kwargs)
|
return ModelField(model_field=model_field, **kwargs)
|
||||||
|
|
||||||
def get_validation_exclusions(self, instance=None):
|
def get_validation_exclusions(self, instance=None):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user