使用模型属性的ModelSerializer


95

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

models.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])

serializers.py:

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

尝试获取相关的URL时,我在该ext_link属性上遇到了一个序列化程序异常(KeyError)。

我如何序列化ext_link属性?

Answers:


134

由于它不是模型字段,因此需要将其显式添加到序列化程序类中

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

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

5
注意事项:Meta中的字段列表是可选的。如果省略fields,在上面的示例中,您将获得序列化数据中的所有MyModel字段加ext_link。这对于复杂的模型真的很棒!编辑:至少,这是正确的djangorestframework==2.3.14
e.thompsy

对我来说,使用serializers.Field给出了一个错误。如果未定义to_representation且视图为只读,则“ serializers.ReadOnlyField”确实起作用。
Shashank Singla

13
我正在使用3.3.x,仅将属性添加到字段是不够的。我仍然必须通过ext_link = serializers.ReadOnlyField()显式添加。
jarmod 2015年

4
在Python 3.5.1和Django 1.10上使用DRF 3.4.6,将字段添加到工作正常。
Vaibhav Mishra

9
注意:使用版本3.7.7时,fields = "__all__"我还必须添加myfield = serializers.ReadOnlyField()指定的jarmod
Robert Townley,

20

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

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

    class Meta:
        model = MyModel
        fields = "__all__"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.