如何在JSON输出中序列化没有字段名称的模型

时间:2014-12-08 18:12:43

标签: django serialization django-rest-framework

我有一个类和序列化器,如下所示:

class MyProperties(models.Model):   
   name = models.CharField(max_length=100, null=False, blank=False)     
   value = models.CharField(max_length=100, null=False, blank=False)
   created_at = models.DateTimeField(auto_now_add=True, auto_now=False)

class MyPropertiesSerializer(serializers.ModelSerializer):
    class Meta:
       model = MyProperties
       fields = ('name', 'value')

它只是一个具有键/值对的属性表(对于此SO问题简化)。

我想序列化此模型,而在输出中包含字段名称。

查看thisthis并没有为我提供创建以下输出的方法:

假设我的数据库表中有两行:

| name   | value    |
|--------|:--------:|
| width  | 7 feet   |
| height | 10 feet  | 

我想要的输出如下:

[
  {"width":"7 feet"}, 
  {"height": "10 feet"}
}

相反,使用我在引用的页面和我发布的示例序列化程序中看到的示例,我得到这样的结果:

[
  {
    "name": "width", 
    "value": "7 feet"
  },
  {
    "name": "height",
    "value": "10 feet"
  }
]

如何创建一个能够提供所需输出格式的串行器?

1 个答案:

答案 0 :(得分:2)

<强>更新

请参阅上面的汤姆克里斯蒂的评论。他是DRF的作者,他的建议比这更好。


您可以使用custom Renderer并在渲染之前操纵输出数据。像这样:

class CustomRenderer(renderers.JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        result = {}
        for item in data: 
            result[item['name']] = item['value'] 

        data = result
        return super(CustomRenderer, self).render(data, accepted_media_type, renderer_context)

并在您的视图中使用它:

class YourView(generics.ListAPIView):
    renderer_classes = (CustomRenderer, renderers.BrowsableAPIRenderer)