У меня есть ItemCollection и Items в моих моделях Django, и я хочу иметь возможность удалять элементы из коллекции через пользовательский интерфейс. В запросе REST PUT я добавляю дополнительное логическое поле deleted
для каждого элемента, чтобы сигнализировать о том, что элемент должен быть удален.
Правильный способ справиться с этим, по-видимому, заключается в методе update
сериализатора. Моя проблема в том, что это немодельное поле deleted
удаляется во время проверки, поэтому оно больше недоступно. Добавление deleted
в качестве SerializerMethodField
не помогло. На данный момент я получаю информацию deleted
из атрибута initial_data
сериализатора, но мне кажется, что это неправильно.
Мой текущий пример кода ниже. Кто-нибудь знает лучший подход?
Модели:
class ItemCollection(models.Model):
description = models.CharField(max_length=256)
class Item(models.Model):
collection = models.ForeignKey(ItemCollection, related_name="items")
Сериализаторы:
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from models import Item, ItemCollection
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
class ItemCollectionSerializer(serializers.ModelSerializer):
items = ItemSerializer(many=True, read_only=False)
class Meta:
model = ItemCollection
def update(self, instance, validated_data):
instance.description = validated_data['description']
for item, item_obj in zip(
self.initial_data['items'], validated_data['items']):
if item['delete']:
instance.items.filter(id=item['id']).delete()
return instance
class ItemCollectionView(APIView):
def get(self, request, ic_id):
item_collection = get_object_or_404(ItemCollection, pk=ic_id)
serialized = ItemCollectionSerializer(item_collection).data
return Response(serialized)
def put(self, request, ic_id):
item_collection = get_object_or_404(ItemCollection, pk=ic_id)
serializer = ItemCollectionSerializer(
item_collection, data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
И пример json в запросе PUT:
{
"id": 2,
"items": [
{
"id": 3,
"collection": 2,
"delete": true
}
],
"description": "mycoll"
}