Django - как обновить элементы в списке одним pUT-запросом

Прошу помощи в следующем. Я хочу обновить объекты в списке одним PUT запросом, как мне это сделать? Я достиг некоторого прогресса, но не могу понять, как это сделать.

В списке PUT для выполнения обновлений могут быть некоторые из объектов в таблице или все. Но я стремлюсь в одном запросе отправить список элементов доли, и чтобы все элементы, которые соответствуют элементам в таблице, были обновлены новыми значениями, если таковые имеются, элементов в списке этого одного PUT запроса.

Models.py

class Share(models.Model):
    ShareName = models.CharField(max_length=100, unique=True, default="N/A")
    ISINCode = models.CharField(max_length=100, primary_key=True, default="N/A")
    Price = models.DecimalField(decimal_places=6, max_digits=9, default=0.000000)

Serializers.py

class ShareSerializer(serializers.ModelSerializer):
    """
    Serializer for Share
    """

    class Meta:
        model = Share
        fields = ('ShareName', 'ISINCode', 'Price')

Views.py

class ShareViewSet(ModelViewSet):
    authentication_classes = []
    permission_classes = []
    queryset = Share.objects.all().order_by('ISINCode')
    # serializer_class = ShareSerializer
    paginator = None

    def get_serializer(self, *args, **kwargs):
        if "data" in kwargs:
            data = kwargs["data"]

            # enable list posting
            if isinstance(data, list):
                kwargs["many"] = True

        return super(ShareViewSet, self).get_serializer(*args, **kwargs)

Я прочитал документацию здесь https://www.django-rest-framework.org/api-guide/serializers/#listserializer и также понял, что один из способов, вероятно, пойти на это - переопределить get_serializer_class, добавить новый listSerializer и добавить логику для чтения элементов внутри, но я не могу понять эту часть.

Override в ShareModelViewSet

def get_serializer_class(self):
    serializer = ShareSerializer
    if self.action == 'perform_update':
        serializer = ShareListSerializer
    return serializer

То, что я сейчас имею в качестве ListSerializer, не уверен, что делаю это правильно.

class ShareListSerializer(serializers.ListSerializer):
    def update(self, validated_data, instance):

        list_of_instances = []

        for each_update in validated_data:
            ISINCode = each_update.get("ISINCode")

            Share_object: Share = Share.objects.filter(
                pk=ISINCode
            ).first()

            del validated_data["ISINCode"]

            if Share_object:
                list_of_instances.append(
                    Share.objects.update(Share_object, validated_data)
                )

            else:
                list_of_instances.append(Share.objects.create(validated_data))

        return list_of_instances

Как будет работать PUT URL?

По другому, но связанному вопросу, для получения и размещения, а также для обновления отдельных элементов вне списка, манипулирование url http://localhost:8000/api/share - это то, как это должно быть сделано, но как это будет работать для элементов внутри списка? http://localhost:8000/api/share/ будет работать для обновления одного элемента share, но для списка, как вы будете ссылаться на него в PUT запросе? http://localhost:8000/api/share/ просто пытается применить изменения в одном pk к каждому элементу в списке. http://localhost:8000/api/share не работает для PUT запросов, подобных этому.

Пример форматирования JSON в PUT-запросе, с которым я хочу работать.

[
    {
        "ShareName": "Shareabc,
        "ISINCode": "123456",
        "Price": 23.35
    },
    {
        "ShareName": "Sharedef,
        "ISINCode": "253525",
        "Price": 11.61
    },

]

Оцените любое руководство, спасибо.

Вернуться на верх