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
},
]
Оцените любое руководство, спасибо.