mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[2.0.x] Fixed #28856 -- Fixed a regression in caching of a GenericForeignKey pointing to a MTI model.
Regression inb9f8635f58. Modified backport ofe50add6ca1from master
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							4d3b8e199e
						
					
				
				
					commit
					d31424fec1
				
			| @@ -228,12 +228,17 @@ class GenericForeignKey(FieldCacheMixin): | |||||||
|  |  | ||||||
|         rel_obj = self.get_cached_value(instance, default=None) |         rel_obj = self.get_cached_value(instance, default=None) | ||||||
|         if rel_obj is not None: |         if rel_obj is not None: | ||||||
|             ct_match = ct_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id |             if ct_id != self.get_content_type(obj=rel_obj, using=instance._state.db).id: | ||||||
|             pk_match = rel_obj._meta.pk.to_python(pk_val) == rel_obj.pk |  | ||||||
|             if ct_match and pk_match: |  | ||||||
|                 return rel_obj |  | ||||||
|             else: |  | ||||||
|                 rel_obj = None |                 rel_obj = None | ||||||
|  |             else: | ||||||
|  |                 pk = rel_obj._meta.pk | ||||||
|  |                 # If the primary key is a remote field, use the referenced | ||||||
|  |                 # field's to_python(). | ||||||
|  |                 pk_to_python = pk.target_field.to_python if pk.remote_field else pk.to_python | ||||||
|  |                 if pk_to_python(pk_val) != rel_obj._get_pk_val(): | ||||||
|  |                     rel_obj = None | ||||||
|  |                 else: | ||||||
|  |                     return rel_obj | ||||||
|         if ct_id is not None: |         if ct_id is not None: | ||||||
|             ct = self.get_content_type(id=ct_id, using=instance._state.db) |             ct = self.get_content_type(id=ct_id, using=instance._state.db) | ||||||
|             try: |             try: | ||||||
|   | |||||||
| @@ -27,3 +27,6 @@ Bugfixes | |||||||
|  |  | ||||||
| * Made query lookups for ``CICharField``, ``CIEmailField``, and ``CITextField`` | * Made query lookups for ``CICharField``, ``CIEmailField``, and ``CITextField`` | ||||||
|   use a ``citext`` cast (:ticket:`28702`). |   use a ``citext`` cast (:ticket:`28702`). | ||||||
|  |  | ||||||
|  | * Fixed a regression in caching of a ``GenericForeignKey`` when the referenced | ||||||
|  |   model instance uses multi-table inheritance (:ticket:`28856`). | ||||||
|   | |||||||
| @@ -48,6 +48,12 @@ class GenericRelationTests(TestCase): | |||||||
|         TextLink.objects.create(content_object=oddrel) |         TextLink.objects.create(content_object=oddrel) | ||||||
|         oddrel.delete() |         oddrel.delete() | ||||||
|  |  | ||||||
|  |     def test_coerce_object_id_remote_field_cache_persistence(self): | ||||||
|  |         restaurant = Restaurant.objects.create() | ||||||
|  |         CharLink.objects.create(content_object=restaurant) | ||||||
|  |         charlink = CharLink.objects.latest('pk') | ||||||
|  |         self.assertIs(charlink.content_object, charlink.content_object) | ||||||
|  |  | ||||||
|     def test_q_object_or(self): |     def test_q_object_or(self): | ||||||
|         """ |         """ | ||||||
|         SQL query parameters for generic relations are properly |         SQL query parameters for generic relations are properly | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user