Пользовательский выходной формат сериализатора - PullRequest
0 голосов
/ 31 октября 2018

Я использую 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 голосов
/ 31 октября 2018

Что-то в этом роде?

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

Но это не сильно изменится, так как инициализация Serializer будет почти такой же, как ваш текущий Ответ.

Тем не менее, вы можете взглянуть на классы пагинации - потому что я думаю, что это та часть, которую вам не хватает.

Итак, в 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. Во всяком случае - если у вас есть какие-либо вопросы - пожалуйста, спросите. Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...