0
0
mirror of https://github.com/django/django.git synced 2024-11-24 20:07:01 +01:00

Fixed #34816 -- Fixed GenericForeignKey crash when checking cache for primary keys with different types.

This commit is contained in:
Oguzhan Akan 2023-09-08 09:47:11 +03:00 committed by GitHub
parent 1ab2cf7994
commit e41f9f9450
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 2 deletions

View File

@ -759,6 +759,7 @@ answer newbie questions, and generally made Django that much better:
Octavio Peri <octaperi@gmail.com> Octavio Peri <octaperi@gmail.com>
oggie rob <oz.robharvey@gmail.com> oggie rob <oz.robharvey@gmail.com>
oggy <ognjen.maric@gmail.com> oggy <ognjen.maric@gmail.com>
Oguzhan Akan <oakan118@gmail.com>
Oliver Beattie <oliver@obeattie.com> Oliver Beattie <oliver@obeattie.com>
Oliver Rutherfurd <http://rutherfurd.net/> Oliver Rutherfurd <http://rutherfurd.net/>
Olivier Le Thanh Duong <olivier@lethanh.be> Olivier Le Thanh Duong <olivier@lethanh.be>

View File

@ -242,8 +242,8 @@ class GenericForeignKey(FieldCacheMixin):
ct_match = ( ct_match = (
ct_id == self.get_content_type(obj=rel_obj, using=instance._state.db).id 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 pk_match = ct_match and rel_obj._meta.pk.to_python(pk_val) == rel_obj.pk
if ct_match and pk_match: if pk_match:
return rel_obj return rel_obj
else: else:
rel_obj = None rel_obj = None

View File

@ -1,3 +1,4 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models import ProtectedError, Q, Sum from django.db.models import ProtectedError, Q, Sum
from django.forms.models import modelform_factory from django.forms.models import modelform_factory
from django.test import TestCase, skipIfDBFeature from django.test import TestCase, skipIfDBFeature
@ -332,3 +333,14 @@ class GenericRelationTests(TestCase):
self.assertSequenceEqual(qs, [link2]) self.assertSequenceEqual(qs, [link2])
qs = Link.objects.exclude(places__name="Test Place 1") qs = Link.objects.exclude(places__name="Test Place 1")
self.assertSequenceEqual(qs, [link2]) self.assertSequenceEqual(qs, [link2])
def test_check_cached_value_pk_different_type(self):
"""Primary key is not checked if the content type doesn't match."""
board = Board.objects.create(name="some test")
oddrel = OddRelation1.objects.create(name="clink")
charlink = CharLink.objects.create(content_object=oddrel)
charlink = CharLink.objects.get(pk=charlink.pk)
self.assertEqual(charlink.content_object, oddrel)
charlink.object_id = board.pk
charlink.content_type_id = ContentType.objects.get_for_model(Board).id
self.assertEqual(charlink.content_object, board)