From f9e5f9ae9f83c7ddf5e5d3c369b6bf54a9b80ab5 Mon Sep 17 00:00:00 2001 From: Rachel Tobin Date: Fri, 21 Jul 2017 15:21:13 -0700 Subject: [PATCH] Fixed #28418 -- Fixed queryset crash when using a GenericRelation to a proxy model. --- AUTHORS | 1 + django/contrib/contenttypes/fields.py | 2 +- docs/releases/1.11.4.txt | 3 +++ tests/generic_relations_regress/models.py | 6 ++++++ tests/generic_relations_regress/tests.py | 5 +++++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 30a0ba7c88..ec21ed5795 100644 --- a/AUTHORS +++ b/AUTHORS @@ -646,6 +646,7 @@ answer newbie questions, and generally made Django that much better: pradeep.gowda@gmail.com Preston Holmes Preston Timmons + Rachel Tobin Rachel Willmer Radek Švarz Rajesh Dhawan diff --git a/django/contrib/contenttypes/fields.py b/django/contrib/contenttypes/fields.py index 57022ad1ef..83944ecfe2 100644 --- a/django/contrib/contenttypes/fields.py +++ b/django/contrib/contenttypes/fields.py @@ -362,7 +362,7 @@ class GenericRelation(ForeignObject): # generating a join to the parent model, then generating joins to the # child models. path = [] - opts = self.remote_field.model._meta + opts = self.remote_field.model._meta.concrete_model._meta parent_opts = opts.get_field(self.object_id_field_name).model._meta target = parent_opts.pk path.append(PathInfo(self.model._meta, parent_opts, (target,), self.remote_field, True, False)) diff --git a/docs/releases/1.11.4.txt b/docs/releases/1.11.4.txt index 180d758246..1f0081c4b6 100644 --- a/docs/releases/1.11.4.txt +++ b/docs/releases/1.11.4.txt @@ -35,3 +35,6 @@ Bugfixes ``checkbox_name``, ``checkbox_id``, ``is_initial``, ``input_text``, ``initial_text``, and ``clear_checkbox_label`` are now attributes of ``widget`` rather than appearing in the top-level context. + +* Fixed queryset crash when using a ``GenericRelation`` to a proxy model + (:ticket:`28418`). diff --git a/tests/generic_relations_regress/models.py b/tests/generic_relations_regress/models.py index 6fca154f15..2011ea14b9 100644 --- a/tests/generic_relations_regress/models.py +++ b/tests/generic_relations_regress/models.py @@ -19,9 +19,15 @@ class Link(models.Model): return "Link to %s id=%s" % (self.content_type, self.object_id) +class LinkProxy(Link): + class Meta: + proxy = True + + class Place(models.Model): name = models.CharField(max_length=100) links = GenericRelation(Link) + link_proxy = GenericRelation(LinkProxy) def __str__(self): return "Place: %s" % self.name diff --git a/tests/generic_relations_regress/tests.py b/tests/generic_relations_regress/tests.py index 0dac7040e4..9add025a46 100644 --- a/tests/generic_relations_regress/tests.py +++ b/tests/generic_relations_regress/tests.py @@ -246,3 +246,8 @@ class GenericRelationTests(TestCase): def test_ticket_22982(self): place = Place.objects.create(name='My Place') self.assertIn('GenericRelatedObjectManager', str(place.links)) + + def test_filter_on_related_proxy_model(self): + place = Place.objects.create() + Link.objects.create(content_object=place) + self.assertEqual(Place.objects.get(link_proxy__object_id=place.id), place)