Django: как включить отсутствующее поле pk в сериализатор при обновлении вложенного объекта?
В моем приложении Django есть сериализатор, предназначенный для обновления вложенного объекта. Обновление работает, но я столкнулся с другой проблемой: я не могу удалить объекты, которые не находятся в validated_data['events]
, потому что у меня нет id, который можно было бы сравнить с id моего экземпляра.
Для справки, вот мои модели:
class Plan(models.Model):
planId = models.CharField(primary_key=True, max_length=100, unique=True)
name = models.CharField(max_length=200)
class PlanEvent(models.Model):
plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
id = models.CharField(primary_key=True, max_length=100, unique=True, blank=False, null=False)
done = models.BooleanField()
title = models.CharField(max_length=100, blank=True)
Это мой PlanEventUpdateSerializer
:
class PlanEventUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = PlanEvent
fields = ('done', 'title')
Есть ли способ включить id
, чтобы я мог сравнить идентификаторы в моем методе update
:
class PlanUpdateSerializer(serializers.ModelSerializer):
events = PlanEventUpdateSerializer(many=True)
class Meta:
model = Plan
fields = ('name',)
....
def update(self, instance, validated_data):
events_validated_data = validated_data.pop('events')
events = (instance.events.all())
events = list(events)
event_ids = [item['id'] for item in events_validated_data]
for event in events:
if event.id not in event_ids:
event.delete()
Я нашел решение. Я определил id
как необязательное поле в сериализаторе и затем смог включить его в поля. Отправка POST и PUT запросов теперь работает, и я также могу удалять объекты при обновлении:
class PlanEventUpdateSerializer(serializers.ModelSerializer):
id = serializers.CharField(source='pk', required=False)
class Meta:
model = PlanEvent
fields = ('id', 'done', 'title')