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')
Вернуться на верх