首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django REST框架:向ModelSerializer添加额外的字段

Django REST框架:向ModelSerializer添加额外的字段
EN

Stack Overflow用户
提问于 2013-08-23 14:47:17
回答 8查看 129.1K关注 0票数 183

我想序列化一个模型,但又想包括一个额外的字段,该字段需要在要序列化的模型实例上执行一些数据库查找:

代码语言:javascript
复制
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连接到该可调用对象?这是什么样子的?

如果有必要,我很乐意澄清这个问题。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-08-25 14:02:59

我想SerializerMethodField就是你要找的东西:

代码语言:javascript
复制
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

票数 278
EN

Stack Overflow用户

发布于 2013-08-23 14:51:32

您可以将模型方法更改为属性,并使用此方法在序列化程序中使用它。

代码语言:javascript
复制
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),您不需要更改属性。模型方法将会工作得很好。

票数 51
EN

Stack Overflow用户

发布于 2016-06-30 22:19:24

在最新版本的Django Rest Framework中,您需要在模型中创建一个带有您想要添加的字段的名称的方法。不需要@propertysource='field'引发错误。

代码语言:javascript
复制
class Foo(models.Model):
    . . .
    def foo(self):
        return 'stuff'
    . . .

class FooSerializer(ModelSerializer):
    foo = serializers.ReadOnlyField()

    class Meta:
        model = Foo
        fields = ('foo',)
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18396547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档