Loading django/db/models/base.py +10 −3 Original line number Diff line number Diff line Loading @@ -468,8 +468,15 @@ class Model(object): return update_fields = frozenset(update_fields) field_names = set([field.name for field in self._meta.fields if not field.primary_key]) field_names = set() for field in self._meta.fields: if not field.primary_key: field_names.add(field.name) if field.name != field.attname: field_names.add(field.attname) non_model_fields = update_fields.difference(field_names) if non_model_fields: Loading Loading @@ -534,7 +541,7 @@ class Model(object): non_pks = [f for f in meta.local_fields if not f.primary_key] if update_fields: non_pks = [f for f in non_pks if f.name in update_fields] non_pks = [f for f in non_pks if f.name in update_fields or f.attname in update_fields] # First, try an UPDATE. If that doesn't update anything, do an INSERT. pk_val = self._get_pk_val(meta) Loading tests/modeltests/update_only_fields/tests.py +8 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,14 @@ class UpdateOnlyFieldsTests(TestCase): self.assertEqual(e3.name, 'Ian') self.assertEqual(e3.profile, profile_receptionist) with self.assertNumQueries(1): e3.profile = profile_boss e3.save(update_fields=['profile_id']) e4 = Employee.objects.get(pk=e3.pk) self.assertEqual(e4.profile, profile_boss) self.assertEqual(e4.profile_id, profile_boss.pk) def test_update_fields_inheritance_with_proxy_model(self): profile_boss = Profile.objects.create(name='Boss', salary=3000) profile_receptionist = Profile.objects.create(name='Receptionist', salary=1000) Loading Loading
django/db/models/base.py +10 −3 Original line number Diff line number Diff line Loading @@ -468,8 +468,15 @@ class Model(object): return update_fields = frozenset(update_fields) field_names = set([field.name for field in self._meta.fields if not field.primary_key]) field_names = set() for field in self._meta.fields: if not field.primary_key: field_names.add(field.name) if field.name != field.attname: field_names.add(field.attname) non_model_fields = update_fields.difference(field_names) if non_model_fields: Loading Loading @@ -534,7 +541,7 @@ class Model(object): non_pks = [f for f in meta.local_fields if not f.primary_key] if update_fields: non_pks = [f for f in non_pks if f.name in update_fields] non_pks = [f for f in non_pks if f.name in update_fields or f.attname in update_fields] # First, try an UPDATE. If that doesn't update anything, do an INSERT. pk_val = self._get_pk_val(meta) Loading
tests/modeltests/update_only_fields/tests.py +8 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,14 @@ class UpdateOnlyFieldsTests(TestCase): self.assertEqual(e3.name, 'Ian') self.assertEqual(e3.profile, profile_receptionist) with self.assertNumQueries(1): e3.profile = profile_boss e3.save(update_fields=['profile_id']) e4 = Employee.objects.get(pk=e3.pk) self.assertEqual(e4.profile, profile_boss) self.assertEqual(e4.profile_id, profile_boss.pk) def test_update_fields_inheritance_with_proxy_model(self): profile_boss = Profile.objects.create(name='Boss', salary=3000) profile_receptionist = Profile.objects.create(name='Receptionist', salary=1000) Loading