Fixed #18362 - Made model.save() update_fields accept attnames
This commit is contained in:
parent
e4a1407a9c
commit
0f49b2bce2
|
@ -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:
|
||||
|
@ -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)
|
||||
|
|
|
@ -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…
Reference in New Issue