我创建了一个ModelSerializer
,并希望添加一个不属于我模型的自定义字段。
我在这里找到了添加额外字段的说明,并尝试了以下操作:
customField = CharField(source='my_field')
当我添加这个字段并调用我的validate()
函数时,这个字段不是attr
dict的一部分。attr
包含指定的所有模型字段,除了额外字段。所以我无法在我的覆盖验证中访问此字段,是吗?
当我像这样将此字段添加到字段列表时:
class Meta:
model = Account
fields = ('myfield1', 'myfield2', 'customField')
然后我得到一个错误,因为customField
不是我的模型的一部分--什么是正确的,因为我只想为这个序列化器添加它。
有没有办法添加自定义字段?
8条答案
按热度按时间np8igboo1#
事实上,有一个解决方案,而不触及所有的模型。您可以使用
SerializerMethodField
,它允许您将任何方法插入序列化程序。qvk1mo1f2#
这样做是正确的,除了
CharField
(和其他类型字段)是用于可写字段。在这种情况下,您只需要一个简单的只读字段,因此只需用途:
vom3gejh3#
...为清楚起见,如果您以以下方式定义了模型方法:
你可以像这样将调用上述方法的结果添加到序列化器中:
p.s.由于自定义字段在你的模型中并不是一个真正的字段,你通常会想让它只读,就像这样:
70gysomp4#
阅读完这里所有的答案,我的结论是,不可能干净地做到这一点。你必须玩一些肮脏的游戏,比如创建一个write_only字段,然后覆盖
validate
和to_representation
方法。这就是我的工作:htrmnn0y5#
这里回答你问题。您应该将以下内容添加到您的模型帐户:
现在您可以用途:
来源:https://stackoverflow.com/a/18396622/3220916
wribegjk6#
为了显示
self.author.full_name
,我得到了一个错误Field
。ReadOnlyField
:vs3odd8k7#
我正在寻找一种解决方案,用于向模型序列化程序添加可写的自定义字段。我找到了这个,这个问题的答案中没有包括。
看起来您确实需要编写自己的简单串行化程序。
现在可以使用此序列化程序向ModelSerializer添加自定义字段
如果Model
MyModel
实际上有一个名为my_custom_field
的属性,但您希望忽略它的验证器,那么这也可以工作。kh212irz8#
在Django Rest Framework的最新版本中,您需要在模型中创建一个方法,该方法具有您想要添加的字段的名称。