我想序列化一个模型,但是想要包含一个额外的字段,该字段需要对要序列化的模型实例进行一些数据库查找:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
这样做的正确方法是什么?我看到you can pass in extra "context"到序列化程序,是传递上下文字典中的附加字段的正确答案?使用这种方法,获得我需要的字段的逻辑不会与串行器定义自包含,这是理想的,因为每个序列化实例都需要 my_field
. 在DRF序列化器文档的其他地方,says "extra fields can correspond to any property or callable on the model" . 我正在谈论的是额外的领域吗?我应该在_232497的模型定义中定义一个返回 my_field
值的函数,并且在序列化器中我将my_field挂钩到那个可调用的函数吗?那是什么样的?
在此先感谢,如有必要,请尽快澄清问题 .
7 回答
我认为SerializerMethodField是您正在寻找的:
http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
正如Chemical Programer在this comment中所述,在最新的DRF中你可以这样做:
DRF docs source
我对类似问题(here)的回答可能有用 .
如果您有以下列方式定义的模型方法:
您可以将调用所述方法的结果添加到序列化程序中,如下所示:
附:由于自定义字段实际上不是模型中的字段,因此您通常希望将其设置为只读,如下所示:
您可以将模型方法更改为属性,并使用此方法在序列化程序中使用它 .
编辑:使用最新版本的rest框架(我尝试过3.3.3),您不需要更改为属性 . 模型方法将正常工作 .
在model.py中
**
**
**
使用最新版本的Django Rest Framework,您需要在模型中创建一个方法,其中包含您要添加的字段的名称 . 不需要
@property
和source='field'
引发错误 .如果你想在额外的字段上读写,你可以使用一个新的自定义序列化器,它扩展了serializers.Serializer,并像这样使用它
我在相关的嵌套字段中使用它与一些自定义逻辑