Fixed #28418 -- Fixed queryset crash when using a GenericRelation to a proxy model.

This commit is contained in:
Rachel Tobin 2017-07-21 15:21:13 -07:00 committed by Tim Graham
parent c6986a4ebf
commit f9e5f9ae9f
5 changed files with 16 additions and 1 deletions

View File

@ -646,6 +646,7 @@ answer newbie questions, and generally made Django that much better:
pradeep.gowda@gmail.com
Preston Holmes <preston@ptone.com>
Preston Timmons <prestontimmons@gmail.com>
Rachel Tobin <rmtobin@me.com>
Rachel Willmer <http://www.willmer.com/kb/>
Radek Švarz <http://www.svarz.cz/translate/>
Rajesh Dhawan <rajesh.dhawan@gmail.com>

View File

@ -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))

View File

@ -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`).

View File

@ -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

View File

@ -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)