Django的REST框架 - 如何添加在ModelSerializer自定义字段(Django R

2019-07-18 22:55发布

我创建了一个ModelSerializer并想添加自定义字段,这是不是我的模型的一部分。

我发现了一个描述添加额外的字段在这里 ,我试过如下:

customField = CharField(source='my_field')

当我加入这个领域,并叫我validate()函数,那么这个字段是不是一部分attr字典。 attr包含除额外的字段指定的所有模型字段。 因此,我不能在我的覆盖验证访问这个领域,可以吗?

当我这个字段添加到这样的字段列表:

class Meta:
    model = Account
    fields = ('myfield1', 'myfield2', 'customField')

然后我得到一个错误,因为customField不是我的模型的一部分-什么是正确的,因为我想增加它只是为这个串行器。

有没有什么办法来添加自定义字段?

Answer 1:

你做了正确的事情,但CharField (和其他类型的字段)是可写的领域。

在这种情况下,你只是想要一个简单的只读场,所以不是只需使用:

customField = Field(source='get_absolute_url')


Answer 2:

事实上,有没有在所有的模型触摸解决方案。 您可以使用SerializerMethodField ,让你可以将任何方法来你的串行器。

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

    def get_foo(self, obj):
        return "Foo id: %i" % obj.pk


Answer 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',
        )


Answer 4:

在这里回答你的问题。 你应该添加到您的模型帐户:

@property
def my_field(self):
    return None

现在你可以使用:

customField = CharField(source='my_field')

来源: https://stackoverflow.com/a/18396622/3220916



Answer 5:

随着Django的REST框架的最后一个版本,你需要在你要添加的字段的名称模型创建的方法。

class Foo(models.Model):
    . . .
    def foo(self):
        return 'stuff'
    . . .

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

    class Meta:
        model = Foo
        fields = ('foo',)


Answer 6:

要显示self.author.full_name ,我买了一个错误Field 。 它曾与ReadOnlyField

class CommentSerializer(serializers.HyperlinkedModelSerializer):
    author_name = ReadOnlyField(source="author.full_name")
    class Meta:
        model = Comment
        fields = ('url', 'content', 'author_name', 'author')


文章来源: Django Rest Framework - How to add custom field in ModelSerializer