如何在ModelSerializer中添加自定义字段?
我创建了一个 ModelSerializer
,想要添加一个自定义字段,这个字段并不是我模型的一部分。
我找到了一些关于如何添加额外字段的说明,在这里,于是我尝试了以下方法:
customField = CharField(source='my_field')
当我添加这个字段并调用我的 validate()
函数时,这个字段并不在 attr
字典里。attr
包含了所有指定的模型字段,但不包括额外的字段。所以在我重写的验证中,我无法访问这个字段,对吧?
当我像这样将这个字段添加到字段列表中:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
然后我就会遇到一个错误,因为 customField
并不是我模型的一部分——这其实是正确的,因为我只是想为这个序列化器添加它。
有没有办法添加一个自定义字段呢?
8 个回答
21
...为了让大家更明白,如果你有一个模型方法是这样定义的:
class MyModel(models.Model):
...
def model_method(self):
return "some_calculated_result"
你可以像下面这样把调用这个方法的结果添加到你的序列化器中:
class MyModelSerializer(serializers.ModelSerializer):
model_method_field = serializers.CharField(source='model_method')
补充一下,因为这个自定义字段其实并不是你模型中的一个字段,所以通常你会想把它设置为只读,像这样:
class Meta:
model = MyModel
read_only_fields = (
'model_method_field',
)
118
其实有一种方法可以解决这个问题,而不需要对模型进行任何修改。你可以使用 SerializerMethodField
,这个功能可以让你把任何方法连接到你的序列化器上。
class FooSerializer(ModelSerializer):
foo = serializers.SerializerMethodField()
def get_foo(self, obj):
return "Foo id: %i" % obj.pk
67
你做得很好,不过 CharField
(还有其他类型的字段)是用来写入数据的。
在这种情况下,你只需要一个简单的只读字段,所以可以直接使用:
customField = Field(source='get_absolute_url')