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