Fixed #20272 - Moved update_fields existence check into Model._do_update.

Thanks Gavin Wahl.
This commit is contained in:
Tim Graham 2013-05-30 10:25:11 -04:00
parent 59235816bd
commit 616f3c4a79
1 changed files with 11 additions and 11 deletions

View File

@ -633,15 +633,7 @@ class Model(six.with_metaclass(ModelBase)):
base_qs = cls._base_manager.using(using) base_qs = cls._base_manager.using(using)
values = [(f, None, (getattr(self, f.attname) if raw else f.pre_save(self, False))) values = [(f, None, (getattr(self, f.attname) if raw else f.pre_save(self, False)))
for f in non_pks] for f in non_pks]
if not values: updated = self._do_update(base_qs, using, pk_val, values, update_fields)
# We can end up here when saving a model in inheritance chain where
# update_fields doesn't target any field in current model. In that
# case we just say the update succeeded. Another case ending up here
# is a model with just PK - in that case check that the PK still
# exists.
updated = update_fields is not None or base_qs.filter(pk=pk_val).exists()
else:
updated = self._do_update(base_qs, using, pk_val, values)
if force_update and not updated: if force_update and not updated:
raise DatabaseError("Forced update did not affect any rows.") raise DatabaseError("Forced update did not affect any rows.")
if update_fields and not updated: if update_fields and not updated:
@ -665,13 +657,21 @@ class Model(six.with_metaclass(ModelBase)):
setattr(self, meta.pk.attname, result) setattr(self, meta.pk.attname, result)
return updated return updated
def _do_update(self, base_qs, using, pk_val, values): def _do_update(self, base_qs, using, pk_val, values, update_fields):
""" """
This method will try to update the model. If the model was updated (in This method will try to update the model. If the model was updated (in
the sense that an update query was done and a matching row was found the sense that an update query was done and a matching row was found
from the DB) the method will return True. from the DB) the method will return True.
""" """
return base_qs.filter(pk=pk_val)._update(values) > 0 if not values:
# We can end up here when saving a model in inheritance chain where
# update_fields doesn't target any field in current model. In that
# case we just say the update succeeded. Another case ending up here
# is a model with just PK - in that case check that the PK still
# exists.
return update_fields is not None or base_qs.filter(pk=pk_val).exists()
else:
return base_qs.filter(pk=pk_val)._update(values) > 0
def _do_insert(self, manager, using, fields, update_pk, raw): def _do_insert(self, manager, using, fields, update_pk, raw):
""" """