Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

Fixed related model lookup regression

It has been possible to use models of wrong type in related field
lookups. For example pigs__in=[a_duck] has worked. Changes to
ForeignObject broke that.

It might be a good idea to restrict the model types usable in lookups.
This should be done intentionally, not accidentally and without any
consideration for deprecation path.
  • Loading branch information...
1 parent 31fadc1 commit 7cca8d56d28e321ffc395c92f82d97adaa0dcf94 @akaariai akaariai committed
Showing with 17 additions and 1 deletion.
  1. +1 −1  django/db/models/fields/
  2. +16 −0 tests/queries/
2  django/db/models/fields/
@@ -1060,7 +1060,7 @@ def get_normalized_value(value):
value_list = []
for source in sources:
# Account for one-to-one relations when sent a different model
- while not isinstance(value, source.model):
+ while not isinstance(value, source.model) and source.rel:
source =
value_list.append(getattr(value, source.attname))
return tuple(value_list)
16 tests/queries/
@@ -2939,3 +2939,19 @@ def test_ticket_20788(self):
sentences_not_in_pub, [book2], lambda x: x)
+class RelatedLookupTypeTests(TestCase):
+ def test_wrong_type_lookup(self):
+ oa = ObjectA.objects.create(name="oa")
+ wrong_type = Order.objects.create(
+ ob = ObjectB.objects.create(name="ob", objecta=oa, num=1)
+ # Currently Django doesn't care if the object is of correct
+ # type, it will just use the objecta's related fields attribute
+ # (id) for model lookup. Making things more restrictive could
+ # be a good idea...
+ self.assertQuerysetEqual(
+ ObjectB.objects.filter(objecta=wrong_type),
+ [ob], lambda x: x)
+ self.assertQuerysetEqual(
+ ObjectB.objects.filter(objecta__in=[wrong_type]),
+ [ob], lambda x: x)

0 comments on commit 7cca8d5

Please sign in to comment.
Something went wrong with that request. Please try again.