如何在ModelSerializer中添加自定义字段?

121 投票
8 回答
128290 浏览
提问于 2025-04-17 14:03

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

我找到了一些关于如何添加额外字段的说明,在这里,于是我尝试了以下方法:

customField = CharField(source='my_field')

当我添加这个字段并调用我的 validate() 函数时,这个字段并不在 attr 字典里。attr 包含了所有指定的模型字段,但不包括额外的字段。所以在我重写的验证中,我无法访问这个字段,对吧?

当我像这样将这个字段添加到字段列表中:

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

然后我就会遇到一个错误,因为 customField 并不是我模型的一部分——这其实是正确的,因为我只是想为这个序列化器添加它。

有没有办法添加一个自定义字段呢?

8 个回答

21

...为了让大家更明白,如果你有一个模型方法是这样定义的:

class MyModel(models.Model):
    ...

    def model_method(self):
        return "some_calculated_result"

你可以像下面这样把调用这个方法的结果添加到你的序列化器中:

class MyModelSerializer(serializers.ModelSerializer):
    model_method_field = serializers.CharField(source='model_method')

补充一下,因为这个自定义字段其实并不是你模型中的一个字段,所以通常你会想把它设置为只读,像这样:

class Meta:
    model = MyModel
    read_only_fields = (
        'model_method_field',
        )
118

其实有一种方法可以解决这个问题,而不需要对模型进行任何修改。你可以使用 SerializerMethodField,这个功能可以让你把任何方法连接到你的序列化器上。

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

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

你做得很好,不过 CharField(还有其他类型的字段)是用来写入数据的。

在这种情况下,你只需要一个简单的只读字段,所以可以直接使用:

customField = Field(source='get_absolute_url')

撰写回答