mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-03 12:00:12 +03:00
nested save for deserialized objects
This commit is contained in:
parent
5cfea7b933
commit
5214615bff
|
@ -887,50 +887,66 @@ class ModelSerializer(Serializer):
|
||||||
"""
|
"""
|
||||||
Save the deserialized object and return it.
|
Save the deserialized object and return it.
|
||||||
"""
|
"""
|
||||||
if getattr(obj, '_nested_forward_relations', None):
|
def save_nested_forward_relations(obj):
|
||||||
# Nested relationships need to be saved before we can save the
|
"""
|
||||||
# parent instance.
|
Save nested nested forward relations
|
||||||
for field_name, sub_object in obj._nested_forward_relations.items():
|
"""
|
||||||
if sub_object:
|
if getattr(obj, '_nested_forward_relations', None):
|
||||||
self.save_object(sub_object)
|
# Nested relationships need to be saved before we can save the
|
||||||
setattr(obj, field_name, sub_object)
|
# parent instance.
|
||||||
|
for field_name, sub_object in obj._nested_forward_relations.items():
|
||||||
|
if sub_object:
|
||||||
|
self.save_object(sub_object)
|
||||||
|
setattr(obj, field_name, sub_object)
|
||||||
|
|
||||||
obj.save(**kwargs)
|
obj.save(**kwargs)
|
||||||
|
|
||||||
if getattr(obj, '_m2m_data', None):
|
def save_m2m(obj):
|
||||||
if hasattr(obj._m2m_data, '__iter__'):
|
"""
|
||||||
|
Save nested ManyToMany relations
|
||||||
|
"""
|
||||||
|
if getattr(obj, '_m2m_data', None) and hasattr(obj._m2m_data, '__iter__'):
|
||||||
for accessor_name, object_list in obj._m2m_data.items():
|
for accessor_name, object_list in obj._m2m_data.items():
|
||||||
if object_list:
|
if hasattr(object_list, '__iter__'):
|
||||||
for m2m_object in object_list:
|
for m2m_object in object_list:
|
||||||
for field in m2m_object.__dict__.keys():
|
save_nested_forward_relations(m2m_object)
|
||||||
if not field == 'id':
|
save_m2m(m2m_object)
|
||||||
attr = getattr(m2m_object, field)
|
save_related_data(m2m_object)
|
||||||
setattr(m2m_object, field, m2m_object.__dict__[field])
|
setattr(obj, accessor_name, object_list)
|
||||||
m2m_object.save()
|
m2m_object.save()
|
||||||
del(obj._m2m_data)
|
del(obj._m2m_data)
|
||||||
|
|
||||||
if getattr(obj, '_related_data', None):
|
def save_related_data(obj):
|
||||||
for accessor_name, related in obj._related_data.items():
|
"""
|
||||||
if isinstance(related, RelationsList):
|
Save nested nested related data
|
||||||
# Nested reverse fk relationship
|
"""
|
||||||
for related_item in related:
|
if getattr(obj, '_related_data', None):
|
||||||
|
for accessor_name, related in obj._related_data.items():
|
||||||
|
if isinstance(related, RelationsList):
|
||||||
|
# Nested reverse fk relationship
|
||||||
|
for related_item in related:
|
||||||
|
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
|
||||||
|
setattr(related_item, fk_field, obj)
|
||||||
|
self.save_object(related_item)
|
||||||
|
|
||||||
|
# Delete any removed objects
|
||||||
|
if related._deleted:
|
||||||
|
[self.delete_object(item) for item in related._deleted]
|
||||||
|
|
||||||
|
elif isinstance(related, models.Model):
|
||||||
|
# Nested reverse one-one relationship
|
||||||
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
|
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
|
||||||
setattr(related_item, fk_field, obj)
|
setattr(related, fk_field, obj)
|
||||||
self.save_object(related_item)
|
self.save_object(related)
|
||||||
|
else:
|
||||||
|
# Reverse FK or reverse one-one
|
||||||
|
setattr(obj, accessor_name, related)
|
||||||
|
del(obj._related_data)
|
||||||
|
|
||||||
# Delete any removed objects
|
# Save
|
||||||
if related._deleted:
|
save_nested_forward_relations(obj)
|
||||||
[self.delete_object(item) for item in related._deleted]
|
save_m2m(obj)
|
||||||
|
save_related_data(obj)
|
||||||
elif isinstance(related, models.Model):
|
|
||||||
# Nested reverse one-one relationship
|
|
||||||
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
|
|
||||||
setattr(related, fk_field, obj)
|
|
||||||
self.save_object(related)
|
|
||||||
else:
|
|
||||||
# Reverse FK or reverse one-one
|
|
||||||
setattr(obj, accessor_name, related)
|
|
||||||
del(obj._related_data)
|
|
||||||
|
|
||||||
|
|
||||||
class HyperlinkedModelSerializerOptions(ModelSerializerOptions):
|
class HyperlinkedModelSerializerOptions(ModelSerializerOptions):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user