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
Надеюсь, это может помочь.