From ae7cb992bca5d211c9456487feb21b84387006eb Mon Sep 17 00:00:00 2001
From: Collin Anderson <cmawebsite@gmail.com>
Date: Mon, 27 Oct 2014 21:36:47 -0400
Subject: [PATCH] Fixed #23721 -- check_related_objects without calling
 __iter__

Refs #14334
---
 django/db/models/sql/query.py | 5 ++---
 tests/queries/models.py       | 4 ++++
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index b6690e4526..4560989e60 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1102,12 +1102,11 @@ class Query(object):
                         'Cannot use QuerySet for "%s": Use a QuerySet for "%s".' %
                         (value.model._meta.model_name, opts.object_name)
                     )
+            elif hasattr(value, '_meta'):
+                self.check_query_object_type(value, opts)
             elif hasattr(value, '__iter__'):
                 for v in value:
                     self.check_query_object_type(v, opts)
-            else:
-                # expecting single model instance here
-                self.check_query_object_type(value, opts)
 
     def build_lookup(self, lookups, lhs, rhs):
         lookups = lookups[:]
diff --git a/tests/queries/models.py b/tests/queries/models.py
index bb3d52a635..fbd6221732 100644
--- a/tests/queries/models.py
+++ b/tests/queries/models.py
@@ -408,6 +408,10 @@ class ObjectA(models.Model):
     def __str__(self):
         return self.name
 
+    def __iter__(self):
+        # Ticket #23721
+        assert False, 'type checking should happen without calling model __iter__'
+
 
 class ProxyObjectA(ObjectA):
     class Meta: