序列化返回选择值django表示

时间:2018-03-19 22:04:39

标签: django django-rest-framework

我有这样的models.py:

class Tasks(models.Model):
  id = models.AutoField(primary_key=True)
  roles = (
        (u'1', u'task1'),
        (u'2', u'task2'),
    )
  role = models.CharField(max_length=1, choices=roles, default='1')

然后我有serializers.py看起来像这样:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tasks
        fields = '__all__'

我的观点看起来像这样:

class Tasks(viewsets.ModelViewSet):
    queryset = Tasks.objects.all()
    serializer_class = TaskSerializer

所以我想做的是;当我发出POSt请求时说我想返回任务角色的已保存数据;如果我将其保存为1,而不是将角色字段返回为1,我想返回task1。我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

您可以在to_representation()中覆盖Serializer class方法,如下所示,

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tasks
        fields = '__all__'

    def to_representation(self, instance):
        return_dict = dict(super().to_representation(instance))

        if self.context.get('view').action == 'create' and return_dict:
            choice_dict = {k[0]: k[1] for k in instance.roles}
            return_dict['role'] = choice_dict[return_dict['role']]

        return return_dict



简短描述
self.context.get('view').action == 'create' create会检查视图的操作是否为POST(简称,create请求)。 因此{ "id": 3, "role": "task2" } 操作的输出响应是这样的,

dict


为什么要对to_representaion()进行类型转换?
OrderedDict()方法返回ng new app-name 不可变对象。