From 041ef6b8388f4b87ffe5733568d05550c61bdd29 Mon Sep 17 00:00:00 2001 From: bboogaard Date: Tue, 19 Aug 2014 10:20:33 +0200 Subject: [PATCH 1/3] Keep track of deferred fields on model instance Instead of on FieldInstanceTracker instance Signed-off-by: bboogaard --- model_utils/tests/tests.py | 20 +++++++++++++++++--- model_utils/tracker.py | 10 +++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 38150a8..bbacfd1 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -1485,13 +1485,13 @@ class FieldTrackerTests(FieldTrackerTestCase, FieldTrackerCommonTests): self.instance.number = 1 self.instance.save() item = list(self.tracked_class.objects.only('name').all())[0] - self.assertTrue(item.tracker.deferred_fields) + self.assertTrue(item._deferred_fields) self.assertEqual(item.tracker.previous('number'), None) - self.assertTrue('number' in item.tracker.deferred_fields) + self.assertTrue('number' in item._deferred_fields) self.assertEqual(item.number, 1) - self.assertTrue('number' not in item.tracker.deferred_fields) + self.assertTrue('number' not in item._deferred_fields) self.assertEqual(item.tracker.previous('number'), 1) self.assertFalse(item.tracker.has_changed('number')) @@ -1499,6 +1499,20 @@ class FieldTrackerTests(FieldTrackerTestCase, FieldTrackerCommonTests): self.assertTrue(item.tracker.has_changed('number')) +class FieldTrackerMultipleInstancesTests(TestCase): + + def test_with_deferred_fields_access_multiple(self): + instances = [ + Tracked.objects.create(pk=1, name='foo', number=1), + Tracked.objects.create(pk=2, name='bar', number=2) + ] + + queryset = Tracked.objects.only('id') + + for instance in queryset: + name = instance.name + + class FieldTrackedModelCustomTests(FieldTrackerTestCase, FieldTrackerCommonTests): diff --git a/model_utils/tracker.py b/model_utils/tracker.py index 6cb4355..be5a7ff 100644 --- a/model_utils/tracker.py +++ b/model_utils/tracker.py @@ -32,10 +32,10 @@ class FieldInstanceTracker(object): def current(self, fields=None): """Returns dict of current values for all tracked fields""" if fields is None: - if self.deferred_fields: + if self.instance._deferred_fields: fields = [ field for field in self.fields - if field not in self.deferred_fields + if field not in self.instance._deferred_fields ] else: fields = self.fields @@ -62,7 +62,7 @@ class FieldInstanceTracker(object): ) def init_deferred_fields(self): - self.deferred_fields = [] + self.instance._deferred_fields = [] if not self.instance._deferred: return @@ -70,7 +70,7 @@ class FieldInstanceTracker(object): def __get__(field, instance, owner): data = instance.__dict__ if data.get(field.field_name, field) is field: - self.deferred_fields.remove(field.field_name) + instance._deferred_fields.remove(field.field_name) value = super(DeferredAttributeTracker, field).__get__( instance, owner) self.saved_data[field.field_name] = deepcopy(value) @@ -79,7 +79,7 @@ class FieldInstanceTracker(object): for field in self.fields: field_obj = self.instance.__class__.__dict__.get(field) if isinstance(field_obj, DeferredAttribute): - self.deferred_fields.append(field) + self.instance._deferred_fields.append(field) # Django 1.4 model = None From ac0957e3ec8bafd5a893fd99171972f48b6a6d00 Mon Sep 17 00:00:00 2001 From: bboogaard Date: Tue, 19 Aug 2014 10:42:41 +0200 Subject: [PATCH 2/3] Update AUTHORS.rst and CHANGES.rst --- AUTHORS.rst | 1 + CHANGES.rst | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index bacbd67..2a26eeb 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -1,6 +1,7 @@ Alejandro Varas Alex Orange Andy Freeland +Bram Boogaard Carl Meyer Curtis Maloney Den Lesnov diff --git a/CHANGES.rst b/CHANGES.rst index 04b0d17..250e036 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,8 @@ +* Keep track of deferred fields on model instance instead of on +FieldInstanceTracker instance. Accessing deferred fields for multiple instances +of a model from the same queryset fails in current release. + + CHANGES ======= From 31170692a54dec9f863e47475b9d7c32eb18e876 Mon Sep 17 00:00:00 2001 From: bboogaard Date: Mon, 1 Sep 2014 09:30:29 +0200 Subject: [PATCH 3/3] Update CHANGES.rst --- CHANGES.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 250e036..e69171f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,14 +1,14 @@ -* Keep track of deferred fields on model instance instead of on -FieldInstanceTracker instance. Accessing deferred fields for multiple instances -of a model from the same queryset fails in current release. - - CHANGES ======= master (unreleased) ------------------- +* Keep track of deferred fields on model instance instead of on +FieldInstanceTracker instance. Accessing deferred fields for multiple instances +of a model from the same queryset fails in current release. + + 2.2 (2014.07.31) ----------------