diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 77c181b6c..274017fdb 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1117,9 +1117,36 @@ class ModelSerializer(Serializer): if source == '*': source = field_name + # Get the right model and info for source with attributes + source_attrs = source.split('.') + source_info = info + source_model = model + + if len(source_attrs) > 1: + attr_info = info + attr_model = model + + for attr in source_attrs[:-1]: + if attr not in attr_info.relations: + break + + attr_model = attr_info.relations[attr].related_model + attr_info = model_meta.get_field_info(attr_model) + else: + attr = source_attrs[-1] + if ( + attr in attr_info.fields_and_pk + or attr in attr_info.relations + or hasattr(attr_model, attr) + or attr == self.url_field_name + ): + source = attr + source_info = attr_info + source_model = attr_model + # Determine the serializer field class and keyword arguments. field_class, field_kwargs = self.build_field( - source, info, model, depth + source, source_info, source_model, depth ) # Include any kwargs defined in `Meta.extra_kwargs`