mirror of
				https://github.com/django/django.git
				synced 2025-11-03 21:25:09 +00:00 
			
		
		
		
	Fixed #29896 -- Fixed incorrect Model.save() cache relation clearing for foreign keys that use to_field.
Regression in ee49306176.
			
			
This commit is contained in:
		
							parent
							
								
									5e8a07d69d
								
							
						
					
					
						commit
						f77fc56c96
					
				
					 3 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
					@ -676,9 +676,9 @@ class Model(metaclass=ModelBase):
 | 
				
			||||||
                        "save() prohibited to prevent data loss due to "
 | 
					                        "save() prohibited to prevent data loss due to "
 | 
				
			||||||
                        "unsaved related object '%s'." % field.name
 | 
					                        "unsaved related object '%s'." % field.name
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
                # If the relationship's pk was changed, clear the cached
 | 
					                # If the relationship's pk/to_field was changed, clear the
 | 
				
			||||||
                # relationship.
 | 
					                # cached relationship.
 | 
				
			||||||
                if obj and obj.pk != getattr(self, field.attname):
 | 
					                if obj and getattr(obj, field.target_field.attname) != getattr(self, field.attname):
 | 
				
			||||||
                    field.delete_cached_value(self)
 | 
					                    field.delete_cached_value(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        using = using or router.db_for_write(self.__class__, instance=self)
 | 
					        using = using or router.db_for_write(self.__class__, instance=self)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,3 +17,6 @@ Bugfixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Fixed a regression in Django 2.0 where test databases aren't reused with
 | 
					* Fixed a regression in Django 2.0 where test databases aren't reused with
 | 
				
			||||||
  ``manage.py test --keepdb`` on MySQL (:ticket:`29827`).
 | 
					  ``manage.py test --keepdb`` on MySQL (:ticket:`29827`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Fixed a regression where cached foreign keys that use ``to_field`` were
 | 
				
			||||||
 | 
					  incorrectly cleared in ``Model.save()`` (:ticket:`29896`).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -666,3 +666,9 @@ class ManyToOneTests(TestCase):
 | 
				
			||||||
        self.a.reporter_id = self.r2.pk
 | 
					        self.a.reporter_id = self.r2.pk
 | 
				
			||||||
        self.a.save()
 | 
					        self.a.save()
 | 
				
			||||||
        self.assertEqual(self.a.reporter, self.r2)
 | 
					        self.assertEqual(self.a.reporter, self.r2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_cached_foreign_key_with_to_field_not_cleared_by_save(self):
 | 
				
			||||||
 | 
					        parent = Parent.objects.create(name='a')
 | 
				
			||||||
 | 
					        child = ToFieldChild.objects.create(parent=parent)
 | 
				
			||||||
 | 
					        with self.assertNumQueries(0):
 | 
				
			||||||
 | 
					            self.assertIs(child.parent, parent)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue