2013-06-12 37 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') 

編輯:在REST框架3增加fields將只是工作 - 不需要添加字段明確。

+0

謝謝!現在工作。 –

+3

***一注***:元字段列表是可選的。如果你省略'fields',在上面的例子中,你將得到序列化數據中的所有'MyModel'字段加'ext_link'。對於複雜的模型來說這真的很棒! *編輯*:至少,這是'djangorestframework == 2.3.14'。 –

+0

對我來說,使用serializers.Field給出了一個錯誤。如果未定義to_representation並且視圖是隻讀的,則「serializers.ReadOnlyField」不起作用。 –