我想序列化一个模型,但又想包括一个额外的字段,该字段需要在要序列化的模型实例上执行一些数据库查找:
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”。我说的是“额外的字段”吗?
我是否应该在Foo
的模型定义中定义一个返回my_field
值的函数,并在序列化程序中将my_field连接到该可调用对象?这是什么样子的?
如果有必要,我很乐意澄清这个问题。
发布于 2013-08-25 14:02:59
我想SerializerMethodField
就是你要找的东西:
class FooSerializer(serializers.ModelSerializer):
my_field = serializers.SerializerMethodField('is_named_bar')
def is_named_bar(self, foo):
return foo.name == "bar"
class Meta:
model = Foo
fields = ('id', 'name', 'my_field')
http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
发布于 2013-08-23 14:51:32
您可以将模型方法更改为属性,并使用此方法在序列化程序中使用它。
class Foo(models.Model):
. . .
@property
def my_field(self):
return stuff
. . .
class FooSerializer(ModelSerializer):
my_field = serializers.ReadOnlyField(source='my_field')
class Meta:
model = Foo
fields = ('my_field',)
编辑:使用最新版本的rest框架(我尝试了3.3.3),您不需要更改属性。模型方法将会工作得很好。
发布于 2016-06-30 22:19:24
在最新版本的Django Rest Framework中,您需要在模型中创建一个带有您想要添加的字段的名称的方法。不需要@property
和source='field'
引发错误。
class Foo(models.Model):
. . .
def foo(self):
return 'stuff'
. . .
class FooSerializer(ModelSerializer):
foo = serializers.ReadOnlyField()
class Meta:
model = Foo
fields = ('foo',)
https://stackoverflow.com/questions/18396547
复制相似问题