2016-07-25 115 views
1

我有一个Django模型是这样的:自定义Django Rest框架序列化器的输出?

class Sections(models.Model): 
    section_id = models.CharField(max_length=127, null=True, blank=True) 
    title = models.CharField(max_length=255) 
    description = models.TextField(null=True, blank=True) 

class Risk(models.Model): 
    title = models.CharField(max_length=256, null=False, blank=False) 
    section = models.ForeignKey(Sections, related_name='risks') 

class Actions(models.Model): 
    title = models.CharField(max_length=256, null=False, blank=False) 
    section = models.ForeignKey(Sections, related_name='actions') 

而串行这样的:

class RiskSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Risk 
     fields = ('id', 'title',) 

class ActionsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Actions 
     fields = ('id', 'title',) 

class RiskActionPerSectionsSerializer(serializers.ModelSerializer): 
    risks = RiskSerializer(many=True, read_only=True) 
    actions = ActionsSerializer(many=True, read_only=True) 

    class Meta: 
     model = Sections 
     fields = ('section_id', 'risks', 'actions') 
     depth = 1 

当通过视图访问RiskActionPerSectionSerializer,我得到下面的输出:

[ 
{ 
    "actions": [ 
     { 
      "id": 2, 
      "title": "Actions 2" 
     }, 
     { 
      "id": 1, 
      "title": "Actions 1" 
     } 
    ], 
    "risks": [ 
     { 
      "id": 2, 
      "title": "Risk 2" 
     }, 
     { 
      "id": 1, 
      "title": "Risk 1" 
     } 
    ], 
    "section_id": "section 1" 
} 
..... 
] 

这很好,但我宁愿有:

{ 
"section 1": { 
    "risks": [ 
     { 
      "id": 2, 
      "title": "Risk 2" 
     }, 
     { 
      "id": 1, 
      "title": "Risk 1" 
     } 
    ], 
    "actions": [ 
     { 
      "id": 2, 
      "title": "Actions 2" 
     }, 
     { 
      "id": 1, 
      "title": "Actions 1" 
     } 
    ] 
} 
} 

我该如何使用Django Rest Framework来做到这一点?

回答

2

您可以覆盖你的串行的to_representation()方法:

class RiskActionPerSectionsSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Sections 
     fields = ('section_id', 'risks', 'actions') 
     depth = 1 

    def to_representation(self, instance): 
     response_dict = dict() 
     response_dict[instance.section_id] = { 
      'actions': ActionsSerializer(instance.actions.all(), many=True).data, 
      'risks': RiskSerializer(instance.risks.all(), many=True).data 
     } 
     return response_dict 
+0

谢谢,完美的作品。 – user659154

+0

@ user659154的欢迎 –

+0

我怎样才能改变输出结构更是这样的: [ “SECTION1”:{ “行动”:[], “风险”:[] }, “第2节”: { “actions”:[], “risks”:[] }, ] – user659154

相关问题