def update(self, instance, validated_data):
reverse_relations = OrderedDict()
relations = OrderedDict()
# Sort fields by create priority
fields = self.get_sorted_by_create_priority(self.fields)
# Remove related fields from validated data for future manipulations
for field_name, field in fields.items():
if field.read_only:
continue
if isinstance(field, serializers.ListSerializer):
if isinstance(field.child, serializers.ModelSerializer):
if validated_data.pop(field.source, None) is None:
# Skip field if field is not required or null allowed
continue
reverse_relations[field_name] = field.child
if isinstance(field, serializers.ModelSerializer):
if validated_data.pop(field.source, None) is None:
# Skip field if field is not required or null allowed
continue
relations[field_name] = field
nested_related_kwarg = getattr(self.Meta, 'nested_related_kwarg', None)
if reverse_relations:
assert nested_related_kwarg, \
"Set `nested_related_kwarg` in Meta options for use nested " \
"create feature"
if relations:
raise NotImplementedError("NestedUpdateMixin not provide update "
"for direct relations")
# Update instance
instance = super(NestedUpdateMixin, self).update(
instance, validated_data)
if reverse_relations:
self.update_reverse_relations(instance, reverse_relations)
self.delete_reverse_relations_if_need(instance, reverse_relations)
return instance
评论列表
文章目录