124

我正在尝试序列化包含我也想序列化的属性字段的模型。

模型.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

序列化程序.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

尝试访问相关 URL 时,我在ext_link属性上收到序列化程序异常 (KeyError)。

如何序列化ext_link属性?

4

3 回答 3

164

因为不是模型字段,所以需要显式添加到序列化器类中

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')
于 2013-06-12T13:02:57.440 回答
46

作为@Robert Townley评论,这适用于版本3.8.2

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

    class Meta:
        model = MyModel
        fields = "__all__"
于 2019-01-18T08:52:11.470 回答
4

接受的答案似乎对我不起作用,ReadOnlyField.

但是,当我使用与我的属性函数的返回类型相对应的字段时,我取得了成功。

因此,对于示例,我会这样做:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.CharField()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

我已经能够使用 , 和 来做到ListFieldDictField一点IntegerField

于 2021-09-29T21:06:30.393 回答