From 0cc9175c7682ac2d2df698597032757e6edd160b Mon Sep 17 00:00:00 2001
From: Josh Schneier <josh.schneier@gmail.com>
Date: Wed, 15 Mar 2017 13:45:18 -0400
Subject: [PATCH] [1.11.x] Fixed #27897 -- Fixed crash with 'pk' in
 ModelAdmin.search_filters.

Backport of 6bc4ff36db0d85ac96ca91ae758159ee43836f86 from master
---
 django/contrib/admin/utils.py   |  2 ++
 tests/admin_changelist/tests.py | 15 +++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/django/contrib/admin/utils.py b/django/contrib/admin/utils.py
index 1e13d13d31..d6b0c28b08 100644
--- a/django/contrib/admin/utils.py
+++ b/django/contrib/admin/utils.py
@@ -36,6 +36,8 @@ def lookup_needs_distinct(opts, lookup_path):
         lookup_fields = lookup_fields[:-1]
     # Now go through the fields (following all relations) and look for an m2m
     for field_name in lookup_fields:
+        if field_name == 'pk':
+            field_name = opts.pk.name
         field = opts.get_field(field_name)
         if hasattr(field, 'get_path_info'):
             # This field is a relation, update opts to follow the relation
diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py
index b2292a77a0..651bcdf475 100644
--- a/tests/admin_changelist/tests.py
+++ b/tests/admin_changelist/tests.py
@@ -445,6 +445,21 @@ class ChangeListTests(TestCase):
         # There's only one Concert instance
         self.assertEqual(cl.queryset.count(), 1)
 
+    def test_pk_in_search_fields(self):
+        band = Group.objects.create(name='The Hype')
+        Concert.objects.create(name='Woodstock', group=band)
+
+        m = ConcertAdmin(Concert, custom_site)
+        m.search_fields = ['group__pk']
+
+        request = self.factory.get('/concert/', data={SEARCH_VAR: band.pk})
+        cl = ChangeList(request, Concert, *get_changelist_args(m))
+        self.assertEqual(cl.queryset.count(), 1)
+
+        request = self.factory.get('/concert/', data={SEARCH_VAR: band.pk + 5})
+        cl = ChangeList(request, Concert, *get_changelist_args(m))
+        self.assertEqual(cl.queryset.count(), 0)
+
     def test_no_distinct_for_m2m_in_list_filter_without_params(self):
         """
         If a ManyToManyField is in list_filter but isn't in any lookup params,