diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2007-07-12 07:45:35 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2007-07-12 07:45:35 +0000 |
| commit | 2d6d20def70dacf4ea783e5a0c8a72266e603bb7 (patch) | |
| tree | fa08081ed0e00e33af408f9e9570b48b1e202a19 /django | |
| parent | 090aa5210ebd5ce3c79db95d3f04c95ed346f42a (diff) | |
Fixed #4459 -- Added 'raw' argument to save method, to override any pre-save processing, and modified serializers to use a raw-save. This enables serialization of DateFields with auto_now/auto_now_add. Also modified serializers to invoke save() directly on the model baseclass, to avoid any (potentially order-dependent, data modifying) behavior in a custom save() method.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@5658 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/serializers/base.py | 7 | ||||
| -rw-r--r-- | django/db/models/base.py | 8 |
2 files changed, 10 insertions, 5 deletions
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py index 1ef7bee472..ee9e4dd621 100644 --- a/django/core/serializers/base.py +++ b/django/core/serializers/base.py @@ -158,7 +158,12 @@ class DeserializedObject(object): return "<DeserializedObject: %s>" % smart_str(self.object) def save(self, save_m2m=True): - self.object.save() + # Call save on the Model baseclass directly. This bypasses any + # model-defined save. The save is also forced to be raw. + # This ensures that the data that is deserialized is literally + # what came from the file, not post-processed by pre_save/save + # methods. + models.Model.save(self.object, raw=True) if self.m2m_data and save_m2m: for accessor_name, object_list in self.m2m_data.items(): setattr(self.object, accessor_name, object_list) diff --git a/django/db/models/base.py b/django/db/models/base.py index d430d03a31..eb8a9b63be 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -201,7 +201,7 @@ class Model(object): _prepare = classmethod(_prepare) - def save(self): + def save(self, raw=False): dispatcher.send(signal=signals.pre_save, sender=self.__class__, instance=self) non_pks = [f for f in self._meta.fields if not f.primary_key] @@ -218,7 +218,7 @@ class Model(object): self._meta.pk.get_db_prep_lookup('exact', pk_val)) # If it does already exist, do an UPDATE. if cursor.fetchone()[0] > 0: - db_values = [f.get_db_prep_save(f.pre_save(self, False)) for f in non_pks] + db_values = [f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, False)) for f in non_pks] if db_values: cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \ (backend.quote_name(self._meta.db_table), @@ -229,11 +229,11 @@ class Model(object): record_exists = False if not pk_set or not record_exists: field_names = [backend.quote_name(f.column) for f in self._meta.fields if not isinstance(f, AutoField)] - db_values = [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)] + db_values = [f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)] # If the PK has been manually set, respect that. if pk_set: field_names += [f.column for f in self._meta.fields if isinstance(f, AutoField)] - db_values += [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)] + db_values += [f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)] placeholders = ['%s'] * len(field_names) if self._meta.order_with_respect_to: field_names.append(backend.quote_name('_order')) |
