自定义Django Rest Framework序列化器输出?

use*_*154 4 python django json django-rest-framework

我有一个像这样的Django模型:

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')
Run Code Online (Sandbox Code Playgroud)

像这样的序列化器:

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
Run Code Online (Sandbox Code Playgroud)

通过视图访问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"
}
.....
]
Run Code Online (Sandbox Code Playgroud)

很好,但我更希望这样:

{
"section 1": {
    "risks": [
        {
          "id": 2,
          "title": "Risk 2"
        }, 
        {
          "id": 1,
          "title": "Risk 1"
        }
    ],
    "actions": [
        {
          "id": 2,
          "title": "Actions 2"
        }, 
        {
          "id": 1,
          "title": "Actions 1"
        }
   ]
}
}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*kin 6

您可以覆盖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
Run Code Online (Sandbox Code Playgroud)