summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2017-04-10 09:47:26 -0400
committerTim Graham <timograham@gmail.com>2017-04-10 09:51:51 -0400
commitfce782710160420d5c963bb33a6646542d91f40c (patch)
tree629e006fdadf0a084f1119c1852021c1acbe6d12
parenta19b373d89d9839c1b3a05768370ce5abd94e03c (diff)
Fixed #28047 -- Fixed QuerySet.filter() crash when it uses the name of a OneToOneField pk.
Regression in 1bc249c2a67c24fcd28436c85388eff1d826e305.
-rw-r--r--django/db/models/fields/related_lookups.py3
-rw-r--r--docs/releases/1.11.1.txt3
-rw-r--r--tests/one_to_one/tests.py4
3 files changed, 9 insertions, 1 deletions
diff --git a/django/db/models/fields/related_lookups.py b/django/db/models/fields/related_lookups.py
index 8063ea801a..62bc92b6ff 100644
--- a/django/db/models/fields/related_lookups.py
+++ b/django/db/models/fields/related_lookups.py
@@ -83,7 +83,8 @@ class RelatedIn(In):
else:
if getattr(self.rhs, '_forced_pk', False):
self.rhs.clear_select_clause()
- if getattr(self.lhs.output_field, 'primary_key', False):
+ if (getattr(self.lhs.output_field, 'primary_key', False) and
+ self.lhs.output_field.model == self.rhs.model):
# A case like Restaurant.objects.filter(place__in=restaurant_qs),
# where place is a OneToOneField and the primary key of
# Restaurant.
diff --git a/docs/releases/1.11.1.txt b/docs/releases/1.11.1.txt
index a10f3f47ef..066127d5e4 100644
--- a/docs/releases/1.11.1.txt
+++ b/docs/releases/1.11.1.txt
@@ -18,3 +18,6 @@ Bugfixes
* Fixed a crash when using a two-tuple in ``EmailMessage``’s ``attachments``
argument (:ticket:`28042`).
+
+* Fixed ``QuerySet.filter()`` crash when it references the name of a
+ ``OneToOneField`` primary key (:ticket:`28047`).
diff --git a/tests/one_to_one/tests.py b/tests/one_to_one/tests.py
index b0843084c2..67eed38a93 100644
--- a/tests/one_to_one/tests.py
+++ b/tests/one_to_one/tests.py
@@ -479,6 +479,10 @@ class OneToOneTests(TestCase):
pk__in=Restaurant.objects.filter(place__id=r.place.pk)
)
self.assertSequenceEqual(q2, [r])
+ q3 = Restaurant.objects.filter(place__in=Place.objects.all())
+ self.assertSequenceEqual(q3, [r])
+ q4 = Restaurant.objects.filter(place__in=Place.objects.filter(id=r.pk))
+ self.assertSequenceEqual(q4, [r])
def test_rel_pk_exact(self):
r = Restaurant.objects.first()