Вложенный JSON с помощью Django apiREST

#python #json #django #django-rest-framework

#python #json #django #django-rest-framework

Вопрос:

У меня есть представление Django REST Framework, подобное этому:

 #views.py
class RegistroViewSet(viewsets.ModelViewSet):
queryset = Registro.objects.all()
serializer_class = RegistroSerializer
  

и ответ JSON имеет такой формат

 [{"id": 1 .....}]
  

и мне нужно что-то вроде этого

 {"success":true,"data":[{"id":"1" ...}]}
  

и сериализатор

 class RegistroSerializer(serializers.HyperlinkedModelSerializer):
idProce = serializers.PrimaryKeyRelatedField(many=False)
idEntidad = serializers.PrimaryKeyRelatedField(many=False)
idUsuario =  serializers.PrimaryKeyRelatedField(many=False)

class Meta:

    model = Registro 
  

Что мне делать?(Новичок в Django)
Спасибо

Ответ №1:

ModelViewSet — это очень отточенный класс, который делает одну очень хорошую вещь: возвращает сериализованные модели, и это все. В этом случае вы могли бы создать свой собственный ViewSet, чтобы позаботиться об этой модели для вас, это позволило бы вам выбирать способ отображения ваших данных, это выглядело бы примерно так:

 from rest_framework.response import Response

class RegistroViewSet(viewsets.ViewSet): #just ViewSet, not ModelViewSet
    def list(self, request):
        queryset = Registro.objects.all()
        serializer = RegistroSerializer(queryset, many=True)
        my_dict = {'success': True, 'data':serializer.data}
        return Response(my_dict)
  

Комментарии:

1. у меня такая ошибка: объект ‘NoneType’ не имеет атрибута ‘items’, моя модель сериализаторов имеет этот регистросериализатор класса формы (serializers. HyperlinkedModelSerializer): … должен ли я это тоже изменить?

2. Это не проблема с вашим классом serializer, но я также не вижу никаких проблем с кодом в моем ответе. Можете ли вы предоставить мне полную трассировку стека?

3. Обратная трассировка: файл «/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py » в файле get_response 112. response = wrapped_callback(запрос, *callback_args, **callback_kwargs) «/usr/local/lib/python2.7/dist-packages/rest_framework/viewsets.py » в представлении 69. для метода, действия в actions.items(): Тип исключения: ошибка атрибута в /api/registros/ Значение исключения: объект ‘NoneType’ не имеет атрибута ‘items’

4. Если вы не регистрируете свое представление на маршрутизаторе, вам может потребоваться сопоставить действия ViewSet вручную в вашем urlconf: url(r'^/api/registros/', RegistroViewSet.as_view({'get': 'list'}))

5. это возвращает 404, но я решил это, изменив RegistroViewSet этого класса (APIView) , но верните это {«data»: [{«id» … }] , «success»: true}, почему? .