我想在Serializer中使用我的模型中的属性(包括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。
我做错了什么?!
我使用以下版本:
答案 0 :(得分:5)
您正在使用ModelSerializer,它会根据模型上的字段自动在序列化程序上创建读写字段。如果它不是Meta.fields
中声明的字段(属性或方法),则默认为只读字段。
在序列化器上明确声明它将使其成为RW字段:
class AwesomeSerializer(serializers.ModelSerializer):
value = serializers.CharField()
class Meta:
model = Awesome
fields = ('value',)
答案 1 :(得分:0)
您可以创建自定义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',)