mirror of
https://github.com/Hopiu/django-model-utils.git
synced 2026-03-16 20:00:23 +00:00
Fixed a bug causing KeyError when saving with the parameter update_fields in which there are untracked fields.
This commit is contained in:
parent
64a47ad861
commit
b9f954074c
4 changed files with 29 additions and 3 deletions
|
|
@ -19,3 +19,4 @@ Simon Meers <simon@simonmeers.com>
|
|||
sayane
|
||||
Trey Hunner <trey@treyhunner.com>
|
||||
zyegfryed
|
||||
Mikhail Silonov <silonov.pro>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@ master (unreleased)
|
|||
* `Choices` now `__contains__` its Python identifier values. Thanks Keryn
|
||||
Knight. (Merge of GH-69).
|
||||
|
||||
* Fixed a bug causing ``KeyError`` when saving with the parameter
|
||||
``update_fields`` in which there are untracked fields.
|
||||
|
||||
|
||||
1.4.0 (2013.06.03)
|
||||
------------------
|
||||
|
|
|
|||
|
|
@ -923,6 +923,16 @@ class FieldTrackedModelCustomTests(FieldTrackerTestCase,
|
|||
self.instance.save()
|
||||
self.assertCurrent(name='new age')
|
||||
|
||||
def test_update_fields(self):
|
||||
# Django 1.4 doesn't have update_fields
|
||||
if django.VERSION >= (1, 5, 0):
|
||||
self.update_instance(name='retro', number=4)
|
||||
self.assertChanged()
|
||||
self.instance.name = 'new age'
|
||||
self.instance.number = 8
|
||||
self.instance.save(update_fields=['name', 'number'])
|
||||
self.assertChanged()
|
||||
|
||||
|
||||
class FieldTrackedModelAttributeTests(FieldTrackerTestCase):
|
||||
|
||||
|
|
@ -976,7 +986,7 @@ class FieldTrackedModelAttributeTests(FieldTrackerTestCase):
|
|||
|
||||
|
||||
class FieldTrackedModelMultiTests(FieldTrackerTestCase,
|
||||
FieldTrackerCommonTests):
|
||||
FieldTrackerCommonTests):
|
||||
|
||||
tracked_class = TrackedMultiple
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,8 @@ class FieldTracker(object):
|
|||
|
||||
def finalize_class(self, sender, **kwargs):
|
||||
if self.fields is None:
|
||||
self.fields = [field.attname for field in sender._meta.local_fields]
|
||||
self.fields = (field.attname for field in sender._meta.local_fields)
|
||||
self.fields = set(self.fields)
|
||||
self.field_map = self.get_field_map(sender)
|
||||
models.signals.post_init.connect(self.initialize_tracker, sender=sender)
|
||||
setattr(sender, self.name, self)
|
||||
|
|
@ -83,8 +84,19 @@ class FieldTracker(object):
|
|||
original_save = instance.save
|
||||
def save(**kwargs):
|
||||
ret = original_save(**kwargs)
|
||||
update_fields = kwargs.get('update_fields')
|
||||
if not update_fields and update_fields is not None: # () or []
|
||||
fields = update_fields
|
||||
elif update_fields is None:
|
||||
fields = None
|
||||
else:
|
||||
fields = (
|
||||
field for field in update_fields if
|
||||
field in self.fields
|
||||
)
|
||||
getattr(instance, self.attname).set_saved_fields(
|
||||
fields=kwargs.get('update_fields'))
|
||||
fields=fields
|
||||
)
|
||||
return ret
|
||||
instance.save = save
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue