使用模型属性的 ModelSerializer

我试图序列化一个包含属性字段的模型,我也想序列化这个属性字段。

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属性?

50980 次浏览

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

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


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

作为 @Robert Townley的评论,这个版本与 3.8.2一起工作:

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


class Meta:
model = MyModel
fields = "__all__"

这个公认的答案似乎对我不起作用,ReadOnlyField也不起作用。

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

举个例子,我会这样做:

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


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

我已经能够做到这一点与 ListFieldDictFieldIntegerField以及。