tfranzel/drf-spectacular

OpenApiSerializerFieldExtension target_class behaviour with __all__

Opened this issue · 1 comments

Imagine we have a following django model:

class A(models.Model):
    a = models.CharField(max_length=64)
    b = models.CharField(null=True, default="b")
    c = models.BooleanField()

and a serializer:

class ASerializer(serializers.ModelSerializer):
    class Meta:
        model = A
        fields = "__all__"

Can I extend generated schema for field b of ASerializer using OpenApiSerializerFieldExtension without explicitly redefining the serializer field as

class BField(serializers.CharField):
    ...
class ASerializer(serializers.ModelSerializer):
    b = BField(required=False, default="b")
    ...
class BFieldFix(OpenApiSerializerExtension):
    target_class = BField
    ...

?

I would recommend this:

  • define a custom model field class BCharField(models.CharField): pass and use it instead.
  • write your BSerializerField(serializers.CharField)
  • patch the mapping into the root class: ModelSerializer.serializer_field_mapping[BCharField] = BSerializerField
  • use your OpenApiSerializerFieldExtension BFieldFix extension as is

this will hook into the model serializer creation and use your own serializer field instead. The extension in turn will see the field being used and apply the extension. This imho the cleanest way to achieve that change.