モデルプロパティを使用した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プロパティをシリアル化するにはどうすればよいですか?

回答:


134

これはモデルフィールドではないため、シリアライザクラスに明示的に追加する必要があります

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

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

5
:メタのフィールドリストはオプションです。fields上記の例でを省略した場合、すべてのMyModelフィールドとext_linkシリアル化されたデータが含まれます。そして、これは複雑なモデルにとって本当に素晴らしいです!編集:少なくとも、これはに当てはまりますdjangorestframework==2.3.14
e.thompsy、2015

私にとって、serializers.Fieldを使用するとエラーが発生しました。「serializers.ReadOnlyField」は、to_representationが定義されておらず、ビューが読み取り専用の場合に機能します。
Shashank Singla 2015

13
3.3.xを使用していますが、フィールドにプロパティを追加するだけでは不十分です。それでも、ext_link = serializers.ReadOnlyField()を使用して明示的に追加する必要があります。
jarmod

4
Python 3.5.1およびDjango 1.10でDRF 3.4.6を使用すると、フィールドへの追加が正常に機能します。
Vaibhav Mishra

9
注:バージョン3.7.7を使用して、指定したjarmodとしてfields = "__all__"追加myfield = serializers.ReadOnlyField()する必要もあります
Robert Townley

20

@Robert Townleyさんのコメントとして、このバージョンで動作し3.8.2ます:

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

    class Meta:
        model = MyModel
        fields = "__all__"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.