Django rest框架为类设置默认序列化程序

2024-09-30 12:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中,我有几个具有多个自定义属性的模型:

@dataclass
class Value:
    amount: float
    currency: str

class MyModel(models.Model):
    ...
    
    @property
    def v1(self) -> Value:
        ...
    
    @property
    def v2(self) -> Value:
        ...
    
    @property
    def v3(self) -> Value:
        ...

我有以下序列化程序:

class MyModelBaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = [..., "v1", "v2", "v3"]

序列化任何MyModel实例时,会出现类型错误:TypeError: Object of type Value is not JSON serializable

我知道这可以通过在MyModelBaseSerializer中显式地添加v1, v2, v3作为字段来解决,但我不想这样做:我有许多具有Value属性的模型。我希望默认的DRF序列化程序知道如何序列化Value实例。

我试图重写to_representation,但似乎不起作用。
我想要类似于重写JSONEncoder.default(o)方法的东西,但是我不知道如何告诉DRF使用哪个编码器


Tags: 实例模型self程序属性序列化valuedef
1条回答
网友
1楼 · 发布于 2024-09-30 12:30:28

Value添加自定义序列化程序。例如(未测试)

class ValueSerializer(serializers.Serializer):
    amount = serializers.FloatField()
    currency = serializers.CharField()


class MyModelBaseSerializer(serializers.ModelSerializer):
    v1 = ValueSerializer()
    v2 = ValueSerializer()
    v3 = ValueSerializer()
    ...

或者,由于Value是一个dataclass,请看一下https://github.com/oxan/djangorestframework-dataclasses

编辑

一种快速而干净利落的方法是重写序列化程序(see docs)上的build_property_field

class MyModelBaseSerializer(serializers.ModelSerializer):
    def build_property_field(self, field_name, model_class):
        if field_name in ["v1", "v2", "v3"]:
            return ValueSerializer, {}
        return super().build_property_field(field_name, model_class)

重写^{}是另一种选择

相关问题 更多 >

    热门问题