[1.11.x] Refs #28856 -- Fixed caching of a GenericForeignKey pointing to a model that uses more than one level of MTI.
This commit is contained in:
parent
1decd0197d
commit
3522203502
|
@ -237,7 +237,15 @@ class GenericForeignKey(object):
|
||||||
pk = rel_obj._meta.pk
|
pk = rel_obj._meta.pk
|
||||||
# If the primary key is a remote field, use the referenced
|
# If the primary key is a remote field, use the referenced
|
||||||
# field's to_python().
|
# field's to_python().
|
||||||
pk_to_python = pk.target_field.to_python if pk.remote_field else pk.to_python
|
to_python_field = pk
|
||||||
|
# Out of an abundance of caution, avoid infinite loops.
|
||||||
|
seen = {to_python_field}
|
||||||
|
while to_python_field.remote_field:
|
||||||
|
to_python_field = to_python_field.target_field
|
||||||
|
if to_python_field in seen:
|
||||||
|
break
|
||||||
|
seen.add(to_python_field)
|
||||||
|
pk_to_python = to_python_field.to_python
|
||||||
if pk_to_python(pk_val) != rel_obj._get_pk_val():
|
if pk_to_python(pk_val) != rel_obj._get_pk_val():
|
||||||
rel_obj = None
|
rel_obj = None
|
||||||
|
|
||||||
|
|
|
@ -17,3 +17,7 @@ Bugfixes
|
||||||
|
|
||||||
* Fixed incorrect foreign key constraint name for models with quoted
|
* Fixed incorrect foreign key constraint name for models with quoted
|
||||||
``db_table`` (:ticket:`28876`).
|
``db_table`` (:ticket:`28876`).
|
||||||
|
|
||||||
|
* Fixed a regression in caching of a ``GenericForeignKey`` when the referenced
|
||||||
|
model instance uses more than one level of multi-table inheritance
|
||||||
|
(:ticket:`28856`).
|
||||||
|
|
|
@ -42,6 +42,12 @@ class Restaurant(Place):
|
||||||
return "Restaurant: %s" % self.name
|
return "Restaurant: %s" % self.name
|
||||||
|
|
||||||
|
|
||||||
|
@python_2_unicode_compatible
|
||||||
|
class Cafe(Restaurant):
|
||||||
|
def __str__(self):
|
||||||
|
return "Cafe: %s" % self.name
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Address(models.Model):
|
class Address(models.Model):
|
||||||
street = models.CharField(max_length=80)
|
street = models.CharField(max_length=80)
|
||||||
|
|
|
@ -5,9 +5,10 @@ from django.forms.models import modelform_factory
|
||||||
from django.test import TestCase, skipIfDBFeature
|
from django.test import TestCase, skipIfDBFeature
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
A, Address, B, Board, C, CharLink, Company, Contact, Content, D, Developer,
|
A, Address, B, Board, C, Cafe, CharLink, Company, Contact, Content, D,
|
||||||
Guild, HasLinkThing, Link, Node, Note, OddRelation1, OddRelation2,
|
Developer, Guild, HasLinkThing, Link, Node, Note, OddRelation1,
|
||||||
Organization, Person, Place, Related, Restaurant, Tag, Team, TextLink,
|
OddRelation2, Organization, Person, Place, Related, Restaurant, Tag, Team,
|
||||||
|
TextLink,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,6 +54,11 @@ class GenericRelationTests(TestCase):
|
||||||
CharLink.objects.create(content_object=restaurant)
|
CharLink.objects.create(content_object=restaurant)
|
||||||
charlink = CharLink.objects.latest('pk')
|
charlink = CharLink.objects.latest('pk')
|
||||||
self.assertIs(charlink.content_object, charlink.content_object)
|
self.assertIs(charlink.content_object, charlink.content_object)
|
||||||
|
# If the model (Cafe) uses more than one level of multi-table inheritance.
|
||||||
|
cafe = Cafe.objects.create()
|
||||||
|
CharLink.objects.create(content_object=cafe)
|
||||||
|
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):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue