Массовое создание не обновляется в drf - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь выполнить массовое обновление с помощью декоратора действий, но вместо этого создаются новые данные.

Мой пример:

@action(methods=['put'], detail=False)
    def car_update(self, request, *args, **kwargs):
        serializer = CarSerializer(data=request.data, many=True, context={'request': request})
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)

Используя мою конечную точку (/ api / car / car_update), создается новая запись.

Пример, я передаю JSON:

[
    {
        "id" 2,
        "color": "blue",
        "amount": 3
    }
]

Но я получаю новое:

[
    {
        "id" 3,
        "color": "blue",
        "amount": 3
    }
]

Когда я пытаюсь передать экземпляр, вот так:

...
car = Car.objects.get()
        serializer = CarSerializer(instance=car, data=request.data, many=True, context={'request': request})

Я получил:

get() returned more than one Car -- it returned 13!

обновление 1

мой пример сериализатора:

class GarageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Garage
        fields = "__all__"

class CarSerializer(serializers.ModelSerializer):
    class Meta:
        model = Car
        fields = "__all__"

мой пример просмотра:

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

    @action(methods=['put'], detail=False)
        def car_update(self, request, *args, **kwargs):
            serializer = CarSerializer(data=request.data, many=True, context={'request': request})
            if serializer.is_valid():
                for instance in serializer.data:
                    Car.objects.get(id=instance['id']).update(**instance)
                return Response(serializer.data)

Ответы [ 2 ]

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

Если я могу понять это правильно сейчас, вы хотите обновить все объекты, указав их идентификаторы внутри данных, отправленных через запрос.То, что вы хотите, не реализовано по умолчанию, так что вы можете использовать этот пример как миксин, если хотите реализовать его для большего количества представлений:

    serializer = CarSerializer(data=request.data, many=True, context={'request': request})
        if serializer.is_valid():
            for instance in serializer.data:
                Car.objects.get(id=instance['id']).update(**instance)

В любом случае, я бы посоветовал обработать исключения, выдаваемыене существует идентификаторов, которые вы хотите изменить.

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

Я никогда не использовал DRF, но в Django вы не могли этого сделать

car = Car.objects.get()

Вам нужно будет сделать что-то вроде этого

car = Car.objects.get(id=..)

или что-то отличное от id = .., которое все равно однозначно идентифицирует ваш экземпляр автомобиля, поскольку .objects.get допускает выбор только одного экземпляра. Это не следует путать с REST 'get', который отличается

...