OpenApiSerializerFieldExtension target_class behaviour with __all__
Opened this issue · 1 comments
SXHRYU commented
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
...
?
tfranzel commented
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.