def perform_update(self, instance, validated_data, errors):
"""
The main nested update logic implementation using nested fields and serializer
"""
for field in self._writable_fields:
if field.field_name not in validated_data:
continue
try:
value = validated_data.get(field.field_name)
if isinstance(field, BaseSerializer):
child_instance = getattr(instance, field.field_name, None)
child_instance = field.get_object(value, child_instance)
if child_instance and field.allow_nested_updates:
value = field.perform_update(child_instance, value, errors)
else:
value = child_instance
elif isinstance(field, ListSerializer) and isinstance(field.child, BaseSerializer):
value = []
for item in validated_data.get(field.field_name):
child_instance = field.child.get_object(item)
if child_instance and (field.child.allow_create or field.child.allow_nested_updates):
v = field.child.perform_update(child_instance, item, errors)
else:
v = child_instance
if v:
value.append(v)
self.update_attribute(instance, field, value)
except Exception as e:
errors.setdefault(field.field_name, []).append(' '.join(e.args))
return instance
评论列表
文章目录