#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}, почему? .