2013-06-12 135 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”不起作用。 –