From dd0bb97082326f880339c63b52124c569b91e738 Mon Sep 17 00:00:00 2001 From: Lucas Berg <55436804+BergLucas@users.noreply.github.com> Date: Wed, 16 Aug 2023 17:24:12 +0200 Subject: [PATCH] Add support for source with attributes in extra_kwargs --- rest_framework/serializers.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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`