From a4055adf702d086334a9ab2ca25a5e41e896a4fb Mon Sep 17 00:00:00 2001 From: Vinny Do Date: Tue, 16 Apr 2019 17:49:16 +1000 Subject: [PATCH] Fixed #30368 -- Fixed prefetch_related() for GenericForeignKey when PK is also a FK. --- AUTHORS | 1 + django/db/models/fields/related.py | 3 +++ tests/prefetch_related/tests.py | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/AUTHORS b/AUTHORS index 96d0696dd1..0557c343db 100644 --- a/AUTHORS +++ b/AUTHORS @@ -880,6 +880,7 @@ answer newbie questions, and generally made Django that much better: Vinay Karanam Vinay Sajip Vincent Foley + Vinny Do Vitaly Babiy Vladimir Kuzma Vlado diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index eda09c2ebe..2eb802e570 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -939,6 +939,9 @@ class ForeignKey(ForeignObject): def get_db_prep_value(self, value, connection, prepared=False): return self.target_field.get_db_prep_value(value, connection, prepared) + def get_prep_value(self, value): + return self.target_field.get_prep_value(value) + def contribute_to_related_class(self, cls, related): super().contribute_to_related_class(cls, related) if self.remote_field.field_name is None: diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py index a32ac81d12..0b3caed0dc 100644 --- a/tests/prefetch_related/tests.py +++ b/tests/prefetch_related/tests.py @@ -891,6 +891,13 @@ class GenericRelationTests(TestCase): qs = Comment.objects.prefetch_related('content_object_uuid') self.assertEqual([c.content_object_uuid for c in qs], [article]) + def test_prefetch_GFK_fk_pk(self): + book = Book.objects.create(title='Poems') + book_with_year = BookWithYear.objects.create(book=book, published_year=2019) + Comment.objects.create(comment='awesome', content_object=book_with_year) + qs = Comment.objects.prefetch_related('content_object') + self.assertEqual([c.content_object for c in qs], [book_with_year]) + def test_traverse_GFK(self): """ A 'content_object' can be traversed with prefetch_related() and