From fc646fdaff1561c0aa45555716019796b1b6e892 Mon Sep 17 00:00:00 2001 From: "T. Franzel" Date: Sat, 4 Mar 2023 11:43:37 +0100 Subject: [PATCH] add test and another case to #901 --- drf_spectacular/openapi.py | 4 ++-- tests/test_regressions.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/drf_spectacular/openapi.py b/drf_spectacular/openapi.py index f5fb9701..decee9da 100644 --- a/drf_spectacular/openapi.py +++ b/drf_spectacular/openapi.py @@ -964,10 +964,10 @@ def _get_serializer_field_meta(self, field, direction): serializers.ModelField, serializers.SerializerMethodField, serializers.PrimaryKeyRelatedField, + serializers.SlugRelatedField, ), ): - # Skip coercion for lack of a better solution. ModelField.to_representation() - # and SerializerMethodField.to_representation() are special in that they require + # Skip coercion for lack of a better solution. These are special in that they require # a model instance or object (which we don't have) instead of a plain value. default = field.default else: diff --git a/tests/test_regressions.py b/tests/test_regressions.py index 377dc7fc..ff1d862b 100644 --- a/tests/test_regressions.py +++ b/tests/test_regressions.py @@ -3036,3 +3036,38 @@ class XViewset(viewsets.ModelViewSet): 'id': {'type': 'integer', 'readOnly': True}, 'field': {'format': 'double', 'readOnly': True, 'type': 'number'} } + + +def test_serializer_foreign_key_default_value_handling(no_warnings): + class M10(models.Model): + field = models.CharField(unique=True) + + class M11(models.Model): + field_related = models.ForeignKey(M10, on_delete=models.CASCADE, default=1) + + class XSerializer(serializers.ModelSerializer): + field_related = serializers.PrimaryKeyRelatedField( + queryset=M11.objects.all(), + default=1, + ) + field_related_slug = serializers.SlugRelatedField( + source='field_related', + slug_field='field', + queryset=M10.objects.all(), + default='foo', + ) + + class Meta: + fields = '__all__' + model = M11 + + class XViewset(viewsets.ModelViewSet): + serializer_class = XSerializer + queryset = M11.objects.none() + + schema = generate_schema('/x', XViewset) + assert schema['components']['schemas']['X']['properties'] == { + 'id': {'type': 'integer', 'readOnly': True}, + 'field_related': {'type': 'integer', 'default': 1}, + 'field_related_slug': {'type': 'string', 'default': 'foo'}, + }