Skip to content

@extend_schema_field does not work on many=True serializers #1456

@SofusStray

Description

@SofusStray

Describe the bug

@extend_schema_field does not work on custom serializers whose parent serializer uses the many=True method because it internally invokes a ListField which does not have that extended schema.

To Reproduce

If you have say a serializer

@extend_schema_field(serializers.DictField())
class MyChild(serializers.Serializer):
    value = serializers.CharField()

class MySerializer(serializers.Serializer):
    child = MyChild()

Then this works perfectly. However say I instead want it to be a list.

class MySerializer(serializers.Serializer):
    children = MyChild(many=True)

Then this no longer works because internally children is now a ListField which does not have any @extend_schema_field

If I for example create my own custom ListField

class MyChild(serializers.Serializer):
    value = serializers.CharField()

@extend_schema_field(serializers.ListField(child=serializers.DictField()))
class MyChildren(serializers.ListField): ...

class MySerializer(serializers.Serializer):
    child = MyChildren(child=MyChild())

It now works because I have correctly wrapped @extend_schema_field in the ListField object. However this is very awkward behaviour and you end up creating a bunch of dummy classes.

Expected behavior

When you wrap @extend_schema_field around a serializer that is invoked with many=True then under the hood a custom ListField should be created which wraps that schema field in a ListField.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions