Django Rest框架 – 如何在ModelSerializer中添加自定义字段
我创build了一个ModelSerializer并想添加一个不属于我的模型的自定义字段。 
我发现了一个描述, 在这里添加额外的字段,我尝试了以下内容:
 customField = CharField(source='my_field') 
 当我添加这个字段并调用我的validate()函数,那么这个字段不是attr dict的一部分。  attr包含除了额外字段外的所有模型字段。 所以我不能在我覆盖的validation中访问这个字段,可以吗? 
当我将这个字段添加到字段列表中,如下所示:
 class Meta: model = Account fields = ('myfield1', 'myfield2', 'customField') 
 那么我得到一个错误,因为customField不是我的模型的一部分 – 什么是正确的,因为我想只为这个序列化程序添加它。 
有没有办法添加一个自定义字段?
 你做的是正确的,除了CharField (和其他types的字段)是可写字段。 
在这种情况下,您只需要一个简单的只读字段,而不是使用:
 customField = Field(source='get_absolute_url') 
 事实上有一个解决scheme,而不触及所有的模型。 您可以使用SerializerMethodField ,它允许您插入任何方法到您的序列化程序。 
 class FooSerializer(ModelSerializer): foo = serializers.SerializerMethodField() def get_foo(self, obj): return "Foo id: %i" % obj.pk 
…为了清楚起见,如果您有以下方式定义的模型方法:
 class MyModel(models.Model): ... def model_method(self): return "some_calculated_result" 
您可以将调用所述方法的结果添加到序列化程序中,如下所示:
 class MyModelSerializer(serializers.ModelSerializer): model_method_field = serializers.CharField(source='model_method') 
ps由于自定义字段在您的模型中并不是真正的字段,因此您通常需要将其设置为只读,如下所示:
 class Meta: model = MyModel read_only_fields = ( 'model_method_field', ) 
这里回答你的问题。 你应该添加到你的模型帐户:
 @property def my_field(self): return None 
现在你可以使用:
 customField = CharField(source='my_field') 
来源: https : //stackoverflow.com/a/18396622/3220916
 为了显示self.author.full_name ,我得到了Field错误。 它与ReadOnlyField一起工作: 
 class CommentSerializer(serializers.HyperlinkedModelSerializer): author_name = ReadOnlyField(source="author.full_name") class Meta: model = Comment fields = ('url', 'content', 'author_name', 'author') 
使用Django Rest Framework的最后一个版本,您需要在您的模型中创build一个名为您要添加的字段的方法。
 class Foo(models.Model): . . . def foo(self): return 'stuff' . . . class FooSerializer(ModelSerializer): foo = serializers.ReadOnlyField() class Meta: model = Foo fields = ('foo',)