自定义输出格式序列化器

时间:2018-10-31 16:38:00

标签: django serialization django-rest-framework

我正在使用Django Rest Framework,并且有此序列化程序。

class UserSerializer(serializers.Serializer):
    name = serializers.CharField()
    email = serializers.CharField()
    phone = serializers.CharField()

产生类似这样的东西:

[
    {"name": "NAME", "email": "EMAIL", "phone": "PHONE"},
    {"name": "NAME", "email": "EMAIL", "phone": "PHONE"},
    {"name": "NAME", "email": "EMAIL", "phone": "PHONE"},
]

但是我希望响应看起来像这样:

{
  "new_user": ID_NEW_USER,
  "data": [
    {"name": "NAME", "email": "EMAIL", "phone": "PHONE"},
    {"name": "NAME", "email": "EMAIL", "phone": "PHONE"},
    {"name": "NAME", "email": "EMAIL", "phone": "PHONE"},
  ]
}

所以我正在这样做。但是看来我应该使用另一个序列化器。

class UserListView(CustomClassMixin):
    def get(self, request):
        users = Users.objects.all()
        new_user = QUERY_TO_GET_NEW_USER
        serializer = UserSerializer(users, many=True)

        return Response({"new_user": new_user, "data": serializer.data})

我尝试使用to_representation方法,但似乎这可能是一种更简单的方法。

有人知道最好的方法吗?

1 个答案:

答案 0 :(得分:0)

类似的东西吗?

class MySerializer(serializers.Serializer):
    new_user = serializers.IntegerField()
    data = serializers.ListSerializer(child=UserSerializer)  # eventually UserSerializer(many=True)

但这并没有太大变化,因为序列化器的初始化与您当前的响应几乎相同。

但是,您可以看一下分页类-因为我认为这是您缺少的部分。

因此,在rest_framework.pagination中,您可以找到不同类型的分页,让我们专注于:PageNumberPagination,那里有一种方法:

def get_paginated_response(self, data):
    return Response(OrderedDict([
        ('count', self.count),
        ('next', self.get_next_link()),
        ('previous', self.get_previous_link()),
        ('results', data)
    ]))

现在,您可以简单地对其进行修改以满足您的需求;因此将results更改为data并为new_user添加其他字段。

也-想知道为什么不使用ModelViewSets。无论如何-如果您有任何问题-请询问。编码愉快。