我创建了一个ModelSerializer
并想添加自定义字段,这是不是我的模型的一部分。
我发现了一个描述添加额外的字段在这里 ,我试过如下:
customField = CharField(source='my_field')
当我加入这个领域,并叫我validate()
函数,那么这个字段是不是一部分attr
字典。 attr
包含除额外的字段指定的所有模型字段。 因此,我不能在我的覆盖验证访问这个领域,可以吗?
当我这个字段添加到这样的字段列表:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
然后我得到一个错误,因为customField
不是我的模型的一部分-什么是正确的,因为我想增加它只是为这个串行器。
有没有什么办法来添加自定义字段?
你做了正确的事情,但CharField
(和其他类型的字段)是可写的领域。
在这种情况下,你只是想要一个简单的只读场,所以不是只需使用:
customField = Field(source='get_absolute_url')
事实上,有没有在所有的模型触摸解决方案。 您可以使用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
随着Django的REST框架的最后一个版本,你需要在你要添加的字段的名称模型创建的方法。
class Foo(models.Model):
. . .
def foo(self):
return 'stuff'
. . .
class FooSerializer(ModelSerializer):
foo = serializers.ReadOnlyField()
class Meta:
model = Foo
fields = ('foo',)
要显示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')