使用Django Rest Framework从模型序列化属性(getter和setter)的问题

bprjcwpo  于 2023-06-07  发布在  Go
关注(0)|答案(2)|浏览(161)

我想在序列化器中使用模型中的属性(包括setter),但显然,setter从未被调用。
models.py

class Awesome(models.Model):
    _value = models.TextField()
    def set_value(self, value):
        self._value = value
    def get_value(self):
        return self._value
    value = property(get_value, set_value)

serializers.py

class AwesomeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Awesome
        fields = ('value',)

views.py

class AwesometViewSet(viewsets.ModelViewSet):
    queryset = Awesome.objects.all()
    serializer_class = AwesomeSerializer

在上面建议的这个场景中,当我进行GET时,getter工作正常,但是当我进行POST时,序列化器不调用setter。
我做错了什么?!
我使用以下版本:

  • python == 3.6.1
  • Django == 1.11.2
  • djangorestframework == 3.6.3
tjjdgumg

tjjdgumg1#

您正在使用ModelSerializer,它会根据模型上的字段自动在序列化程序上创建读写字段。当它不是字段(属性或方法)并在Meta.fields中声明时,它默认为只读字段。
在序列化器上显式声明它将使其成为RW字段:

class AwesomeSerializer(serializers.ModelSerializer):
    value = serializers.CharField()
    class Meta:
        model = Awesome
        fields = ('value',)
8dtrkrch

8dtrkrch2#

你可以创建一个自定义的Field类并覆盖函数,而不是在序列化器中使用getter和setter:

  • to_representation-代替getter
  • to_internal_value-代替setter

例如:

class ParamsField(serializers.JSONField):
    def to_representation(self, obj):
        # Use the method `get_params` from the Awesome class
        return Awesome.get_params(obj)

    def to_internal_value(self, data):
        # Set the key `date` just for the example
        data["date"] = datetime.datetime.now().isoformat()
        return data

class AwesomeSerializer(serializers.ModelSerializer):
    value = ParamsField()

    class Meta:
        model = Awesome
        fields = ('value',)

相关问题