Как лучший способ создать функцию для передачи JSON с помощью сериализатора в отдыхе Django? - PullRequest
1 голос
/ 29 марта 2019

Я изучаю рамки отдыха django и хотел бы создать функцию. В этой функции мне нужно передать список в JSON и обновить его по сериализатору.

Для справки я написал пример кода ниже.

Пример Serialzer:

class GarageViewSet(viewsets.ModelViewSet):
    queryset = Garage.objects.all()
    serializer_class = GarageSerializer
    model = Garage

class CarViewSet(RestrictedQuerysetMixin, viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    model = Car

Хорошо. Мне нужно обновить список автомобилей через гаражный сериализатор. Я думаю что-нибудь вроде этого:

(пример просмотра)

class GarageViewSet(viewsets.ModelViewSet):
    queryset = Garage.objects.all()
    serializer_class = GarageSerializer
    model = Garage

    @action(detail=True, methods=['put'])
        def update_car(self, request):
            ...
            serializer = CarSerializer(queryset, many=True)
            ...
            return Response(serializer.data)

Попытка 1:

В поиске и чтении документа я попробовал так:

        @action(methods=['put'], detail=False)
        def update_car(self, request, *args, **kwargs):     
        if request.method == 'PUT':
            data = JSONParser().parse(request)
            serializer = CarSerializer(data=data, many=True)
            if serializer.is_valid():
                serializer.save()
                return JsonResponse(serializer.data)
            return JsonResponse(serializer.errors, status=400)

Но я получил эту ошибку:

non_field_errors:
["Expected a list of items but got type "dict"."]

Попытка 2:

С @fxgx я тоже пробовал:

    def update_car(self, request):
        serializer = CarSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        validated_data = dict(list(serializer.validated_data.items()))
        queryset = Car.objects.update(**validated_data)
        return Response(CarSerializer(queryset, many=True).data)

Но я получил эту ошибку:

{
    "detail": "Not found."
}

1 Ответ

1 голос
/ 02 апреля 2019

Сериализаторы DRF не поддерживают массовые обновления, вы должны передать экземпляр объекта в сериализатор, чтобы обновить его.Что вы можете сделать, это сериализовать данные с помощью сериализатора, обновить объекты проверенными данными, а затем снова сериализовать объекты, чтобы получить данные ответа:

    class GarageViewSet(viewsets.ModelViewSet):
        queryset = Garage.objects.all()
        serializer_class = GarageSerializer
        model = Garage

        @action(detail=False, methods=['put'])
        def update_car(self, request):
            ...
            # Use partial=True for partial updates.
            serializer = CarSerializer(data=request.data)

            # Validate data.
            serializer.is_valid(raise_exception=True)

            # Get validated data in dictionary format.
            validated_data = dict(list(serializer.validated_data.items()))

            # Update objects
            quertset.update(**validated_data)

            ...
            return Response(CarSerializer(queryset, many=True).data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...