Django REST框架:向ModelSerializer添加额外的字段
我想要序列化一个模型,但想要包含一个额外的字段,需要在待实例化的模型实例上进行一些数据库查找:
class FooSerializer(serializers.ModelSerializer): my_field = ... # result of some database queries on the input Foo object class Meta: model = Foo fields = ('id', 'name', 'myfield')
什么是正确的方法来做到这一点? 我看到你可以传递额外的“上下文”到序列化程序,是正确的答案传递在上下文字典中的额外的领域? 采用这种方法,获取我所需要的字段的逻辑将不会与序列化程序定义自成一体,这是理想的,因为每个序列化的实例都需要my_field
。 在DRF序列化文件的其他地方,它说 “额外的字段可以对应任何属性或在模型上可调用”。 额外的领域我在说什么? 我应该在Foo
的模型定义中定义一个返回my_field
值的函数,而在序列化程序中,我将my_field连接到可调用的? 这是什么样子?
在此先感谢,如有必要,我们很乐意澄清这个问题。
我想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
您可以将您的模型方法更改为属性,并使用此方法在序列化程序中使用它。
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),你不需要改变属性。 模型方法将正常工作。
我对类似的问题( 这里 )的回答可能是有用的。
如果您有以下方式定义的模型方法:
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', )
使用Django Rest Framework的最后一个版本,您需要在您的模型中创build一个名为您要添加的字段的方法。 不需要@property
和source='field'
引发错误。
class Foo(models.Model): . . . def foo(self): return 'stuff' . . . class FooSerializer(ModelSerializer): foo = serializers.ReadOnlyField() class Meta: model = Foo fields = ('foo',)