Django DRF - Обновление модели "многие-к-одному" в сериализаторе

Структура моих моделей довольно проста: отношения "многие к одному", где набор Conditions ссылается на один Item по внешнему ключу.

А здесь у нас есть соответствующий serializers.py:

class ConditionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Condition
        fields = ('condition_id','name', 'left', 'operator', 'right')

 class ItemSerializer(serializers.ModelSerializer):
    conditions = ConditionSerializer(many=True, read_only=True)

    def create(self, validated_data):
        conditions_data = validated_data.pop("conditions")
        item = Item.objects.create(**validated_data)
        for condition_data in conditions_data:
            Condition.objects.create(item=item, **condition_data)
        return item

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        conditions_data = validated_data.get('conditions', instance.conditions)
        for c in conditions_data.all():
            print(c.name)   # it correctly prints out the value
        instance.conditions.set(conditions_data.all())   # Doesn't update the instance
        instance.save()
        return instance

    class Meta:
        model = Item
        fields = ('item_id', 'name', 'conditions')

Проблема заключается в функции update: instance.name обновляется правильно; instance.conditions.set(conditions_data.all()) не обновляется.

Ошибка не отображается, так как ответ 200OK.

Я также поместил в цикл for печать поля объекта Condition (имя) и оно успешно отображается, показывая, что данные правильно прочитаны.

Я попытался решить проблему, удалив read_only=True из ConditionSerializer, но ситуация ухудшилась, поскольку я получаю ошибку:

AttributeError: объект 'list' не имеет атрибута 'all'

Возможно, проблема связана с управлением внешними ключами.

Есть ли способ решить эту проблему?

Думаю, вам нужно установить их идентификаторы.

class ItemSerializer(serializers.ModelSerializer):
    conditions = ConditionSerializer(many=True, read_only=True)
    ...

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        conditions_data = validated_data.get('conditions', instance.conditions)
        condition_ids = []
        for c in conditions_data.all():
            condition_ids.append(c.id)
        instance.conditions.set(condition_ids)
        instance.save()
        return instance

Надеюсь, это может помочь.

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