2013-06-12 4 views
49

私はシリアル化したいプロパティフィールドを含むモデルをシリアル化しようとしています。モデルプロパティを使用したModelSerializer

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

答えて

78

それはモデルフィールドではありませんので、それは

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

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

編集シリアライザクラスに明示的に追加する必要があります:fieldsへの追加RESTフレームワークで 3だけで動作します - 追加する必要はありません。フィールド。

+0

ありがとうございます!今すぐ動作します。 –

+3

***ワンノート***:メタのフィールドリストはオプションです。上の例で 'fields'を省略すると、直列化されたデータに' MyModel'フィールドと 'ext_link'を加えたものになります。そして、これは複雑なモデルにとって本当に最高です! * EDIT *:少なくとも、これは 'djangorestframework == 2.3.14'に当てはまります。 –

+0

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