mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	[4.1.x] Fixed #33952 -- Reallowed creating reverse foreign key managers on unsaved instances.
Thanks Claude Paroz for the report. Regression in7ba6ebe914. Backport of806e9e2d0dfrom main
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							0890719402
						
					
				
				
					commit
					fca055315e
				
			| @@ -627,15 +627,6 @@ def create_reverse_many_to_one_manager(superclass, rel): | ||||
|  | ||||
|             self.core_filters = {self.field.name: instance} | ||||
|  | ||||
|             # Even if this relation is not to pk, we require still pk value. | ||||
|             # The wish is that the instance has been already saved to DB, | ||||
|             # although having a pk value isn't a guarantee of that. | ||||
|             if self.instance.pk is None: | ||||
|                 raise ValueError( | ||||
|                     f"{instance.__class__.__name__!r} instance needs to have a primary " | ||||
|                     f"key value before this relationship can be used." | ||||
|                 ) | ||||
|  | ||||
|         def __call__(self, *, manager): | ||||
|             manager = getattr(self.model, manager) | ||||
|             manager_class = create_reverse_many_to_one_manager(manager.__class__, rel) | ||||
| @@ -700,6 +691,14 @@ def create_reverse_many_to_one_manager(superclass, rel): | ||||
|                 pass  # nothing to clear from cache | ||||
|  | ||||
|         def get_queryset(self): | ||||
|             # Even if this relation is not to pk, we require still pk value. | ||||
|             # The wish is that the instance has been already saved to DB, | ||||
|             # although having a pk value isn't a guarantee of that. | ||||
|             if self.instance.pk is None: | ||||
|                 raise ValueError( | ||||
|                     f"{self.instance.__class__.__name__!r} instance needs to have a " | ||||
|                     f"primary key value before this relationship can be used." | ||||
|                 ) | ||||
|             try: | ||||
|                 return self.instance._prefetched_objects_cache[ | ||||
|                     self.field.remote_field.get_cache_name() | ||||
|   | ||||
| @@ -49,3 +49,6 @@ Bugfixes | ||||
|  | ||||
| * Fixed a regression in Django 4.1 that caused an incorrect migration when | ||||
|   renaming a model with ``ManyToManyField`` and ``db_table`` (:ticket:`33953`). | ||||
|  | ||||
| * Reallowed, following a regression in Django 4.1, creating reverse foreign key | ||||
|   managers on unsaved instances (:ticket:`33952`). | ||||
|   | ||||
| @@ -748,6 +748,9 @@ class ManyToOneTests(TestCase): | ||||
|         ) | ||||
|         with self.assertRaisesMessage(ValueError, msg): | ||||
|             th.child_set.count() | ||||
|         # The reverse foreign key manager can be created. | ||||
|         self.assertEqual(th.child_set.model, Third) | ||||
|  | ||||
|         th.save() | ||||
|         # Now the model is saved, so we will need to execute a query. | ||||
|         with self.assertNumQueries(1): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user