8000 Merge pull request #797 from maspwr/writable-nested-modelserializer · dhepper/django-rest-framework@0080bf8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0080bf8

Browse files
committed
Merge pull request encode#797 from maspwr/writable-nested-modelserializer
Don't use field when saving related data
2 parents 1148b25 + 7e0a93f commit 0080bf8

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

rest_framework/serializers.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ def errors(self):
460460
ret.append(self.from_native(item, None))
461461
errors.append(self._errors)
462462

463-
if update:
463+
if update and self.allow_add_remove:
464464
ret._deleted = identity_to_objects.values()
465465

466466
self._errors = any(errors) and errors or []
@@ -514,7 +514,7 @@ def save(self, **kwargs):
514514
if isinstance(self.object, list):
515515
[self.save_object(item, **kwargs) for item in self.object]
516516

517-
if self.allow_add_remove and self.object._deleted:
517+
if self.object._deleted:
518518
[self.delete_object(item) for item in self.object._deleted]
519519
else:
520520
self.save_object(self.object, **kwargs)
@@ -779,24 +779,22 @@ def save_object(self, obj, **kwargs):
779779

780780
if getattr(obj, '_related_data', None):
781781
for accessor_name, related in obj._related_data.items():
782-
field = self.fields.get(accessor_name, None)
783-
if isinstance(field, Serializer):
784-
if field.many:
785-
# Nested reverse fk relationship
786-
for related_item in related:
787-
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
788-
setattr(related_item, fk_field, obj)
789-
self.save_object(related_item)
790-
791-
# Delete any removed objects
792-
if field.allow_add_remove and related._deleted:
793-
[self.delete_object(item) for item in related._deleted]
794-
795-
else:
796-
# Nested reverse one-one relationship
782+
if isinstance(related, RelationsList):
783+
# Nested reverse fk relationship
784+
for related_item in related:
797785
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
798-
setattr(related, fk_field, obj)
799-
self.save_object(related)
786+
setattr(related_item, fk_field, obj)
787+
self.save_object(related_item)
788+
789+
# Delete any removed objects
790+
if related._deleted:
791+
[self.delete_object(item) for item in related._deleted]
792+
793+
elif isinstance(related, models.Model):
794+
# Nested reverse one-one relationship
795+
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
796+
setattr(related, fk_field, obj)
797+
self.save_object(related)
800798
else:
801799
# Reverse FK or reverse one-one
802800
setattr(obj, accessor_name, related)

0 commit comments

Comments
 (0)
0