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',)