mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #28147 -- Fixed loss of assigned parent when saving child after parent.
Thanks Erwin Junge for the initial patch.
This commit is contained in:
@@ -684,14 +684,19 @@ class Model(metaclass=ModelBase):
|
||||
# database to raise an IntegrityError if applicable. If
|
||||
# constraints aren't supported by the database, there's the
|
||||
# unavoidable risk of data corruption.
|
||||
if obj and obj.pk is None:
|
||||
# Remove the object from a related instance cache.
|
||||
if not field.remote_field.multiple:
|
||||
field.remote_field.delete_cached_value(obj)
|
||||
raise ValueError(
|
||||
"save() prohibited to prevent data loss due to "
|
||||
"unsaved related object '%s'." % field.name
|
||||
)
|
||||
if obj:
|
||||
if obj.pk is None:
|
||||
# Remove the object from a related instance cache.
|
||||
if not field.remote_field.multiple:
|
||||
field.remote_field.delete_cached_value(obj)
|
||||
raise ValueError(
|
||||
"save() prohibited to prevent data loss due to "
|
||||
"unsaved related object '%s'." % field.name
|
||||
)
|
||||
elif getattr(self, field.attname) is None:
|
||||
# Use pk from related object if it has been saved after
|
||||
# an assignment.
|
||||
setattr(self, field.attname, obj.pk)
|
||||
# If the relationship's pk/to_field was changed, clear the
|
||||
# cached relationship.
|
||||
if obj and getattr(obj, field.target_field.attname) != getattr(self, field.attname):
|
||||
|
||||
@@ -1031,6 +1031,10 @@ class OneToOneField(ForeignKey):
|
||||
setattr(instance, self.name, data)
|
||||
else:
|
||||
setattr(instance, self.attname, data)
|
||||
# Remote field object must be cleared otherwise Model.save()
|
||||
# will reassign attname using the related object pk.
|
||||
if data is None:
|
||||
setattr(instance, self.name, data)
|
||||
|
||||
def _check_unique(self, **kwargs):
|
||||
# Override ForeignKey since check isn't applicable here.
|
||||
|
||||
Reference in New Issue
Block a user