diff options
| author | 葛汉斌 <xiaomiba0904@gmail.com> | 2019-05-28 21:40:31 +0800 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-05-28 15:40:31 +0200 |
| commit | fcbc502af93f0ee75522c45ae6ec2925da9f2145 (patch) | |
| tree | 0c14e643717a48e185b5e9df65718ef3075d11ba | |
| parent | 67b6cb7723b2765cb776bd59d5603e3e63eefc2e (diff) | |
Simplified Model.save() a bit.
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/db/models/base.py | 29 |
2 files changed, 16 insertions, 14 deletions
@@ -305,6 +305,7 @@ answer newbie questions, and generally made Django that much better: Gasper Koren Gasper Zejn <zejn@kiberpipa.org> Gavin Wahl <gavinwahl@gmail.com> + Ge Hanbin <xiaomiba0904@gmail.com> geber@datacollect.com Geert Vanderkelen George Karpenkov <george@metaworld.ru> diff --git a/django/db/models/base.py b/django/db/models/base.py index 0d704684f1..71d04244e0 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -678,28 +678,29 @@ class Model(metaclass=ModelBase): # been assigned and there's no need to worry about this check. if field.is_relation and field.is_cached(self): obj = getattr(self, field.name, None) + if not obj: + continue # A pk may have been assigned manually to a model instance not # saved to the database (or auto-generated in a case like # UUIDField), but we allow the save to proceed and rely on the # 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: - 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 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): + if getattr(obj, field.target_field.attname) != getattr(self, field.attname): field.delete_cached_value(self) using = using or router.db_for_write(self.__class__, instance=self) |
