# models.py from django.db import models class ModelOne(models.Model): field = models.CharField(max_length=10) class ModelTwo(models.Model): model_one = models.ForeignKey(ModelOne) class ModelThree(models.Model): model_one = models.ForeignKey(ModelOne) # Then, in ./manage.py shell (the name of my test app is "exclude"): In[0]: from exclude.models import ModelTwo In [1]: ModelTwo.objects.filter(model_one__modelthree__id=1) Out[1]: [] In [2]: ModelTwo.objects.exclude(model_one__modelthree__id=1) Out[2]: ERROR: Internal Python error in the inspect module. Below is the traceback from this internal error. Traceback (most recent call last): File "/usr/lib/python2.5/site-packages/IPython/ultraTB.py", line 635, in text locals,formatvalue=var_repr)) File "/usr/lib/python2.5/inspect.py", line 812, in formatargvalues specs.append(strseq(args[i], convert, join)) File "/usr/lib/python2.5/inspect.py", line 767, in strseq return convert(object) File "/usr/lib/python2.5/inspect.py", line 809, in convert return formatarg(name) + formatvalue(locals[name]) KeyError: 'connection' IPython's exception reporting continues... --------------------------------------------------------------------------- OperationalError Traceback (most recent call last) /home/brent/django/testing/ in () /usr/lib/python2.5/site-packages/IPython/Prompts.py in __call__(self, arg) 533 534 # and now call a possibly user-defined print mechanism --> 535 manipulated_val = self.display(arg) 536 537 # user display hooks can change the variable to be stored in /usr/lib/python2.5/site-packages/IPython/Prompts.py in _display(self, arg) 559 return IPython.generics.result_display(arg) 560 except TryNext: --> 561 return self.shell.hooks.result_display(arg) 562 563 # Assign the default display method: /usr/lib/python2.5/site-packages/IPython/hooks.py in __call__(self, *args, **kw) 132 #print "prio",prio,"cmd",cmd #dbg 133 try: --> 134 ret = cmd(*args, **kw) 135 return ret 136 except ipapi.TryNext, exc: /usr/lib/python2.5/site-packages/IPython/hooks.py in result_display(self, arg) 160 161 if self.rc.pprint: --> 162 out = pformat(arg) 163 if '\n' in out: 164 # So that multi-line strings line up with the left column of /usr/lib/python2.5/pprint.py in pformat(self, object) 109 def pformat(self, object): 110 sio = _StringIO() --> 111 self._format(object, sio, 0, 0, {}, 0) 112 return sio.getvalue() 113 /usr/lib/python2.5/pprint.py in _format(self, object, stream, indent, allowance, context, level) 127 self._readable = False 128 return --> 129 rep = self._repr(object, context, level - 1) 130 typ = _type(object) 131 sepLines = _len(rep) > (self._width - 1 - indent - allowance) /usr/lib/python2.5/pprint.py in _repr(self, object, context, level) 193 def _repr(self, object, context, level): 194 repr, readable, recursive = self.format(object, context.copy(), --> 195 self._depth, level) 196 if not readable: 197 self._readable = False /usr/lib/python2.5/pprint.py in format(self, object, context, maxlevels, level) 205 and whether the object represents a recursive construct. 206 """ --> 207 return _safe_repr(object, context, maxlevels, level) 208 209 /usr/lib/python2.5/pprint.py in _safe_repr(object, context, maxlevels, level) 290 return format % _commajoin(components), readable, recursive 291 --> 292 rep = repr(object) 293 return rep, (rep and not rep.startswith('<')), False 294 /usr/lib/python2.5/site-packages/django/db/models/query.py in __repr__(self) 142 143 def __repr__(self): --> 144 return repr(list(self)) 145 146 def __len__(self): /usr/lib/python2.5/site-packages/django/db/models/query.py in __len__(self) 154 self._result_cache = list(self.iterator()) 155 elif self._iter: --> 156 self._result_cache.extend(list(self._iter)) 157 return len(self._result_cache) 158 /usr/lib/python2.5/site-packages/django/db/models/query.py in iterator(self) 267 extra_select = self.query.extra_select.keys() 268 index_start = len(extra_select) --> 269 for row in self.query.results_iter(): 270 if fill_cache: 271 obj, _ = get_cached_row(self.model, row, index_start, /usr/lib/python2.5/site-packages/django/db/models/sql/query.py in results_iter(self) 204 resolve_columns = hasattr(self, 'resolve_columns') 205 fields = None --> 206 for rows in self.execute_sql(MULTI): 207 for row in rows: 208 if resolve_columns: /usr/lib/python2.5/site-packages/django/db/models/sql/query.py in execute_sql(self, result_type) 1721 1722 cursor = self.connection.cursor() -> 1723 cursor.execute(sql, params) 1724 1725 if not result_type: /usr/lib/python2.5/site-packages/django/db/backends/mysql/base.py in execute(self, query, args) 81 def execute(self, query, args=None): 82 try: ---> 83 return self.cursor.execute(query, args) 84 except Database.OperationalError, e: 85 # Map some error codes to IntegrityError, since they seem to be /usr/lib/python2.5/site-packages/MySQLdb/cursors.py in execute(self, query, args) 164 del tb 165 self.messages.append((exc, value)) --> 166 self.errorhandler(self, exc, value) 167 self._executed = query 168 if not self._defer_warnings: self._warning_check() /usr/lib/python2.5/site-packages/MySQLdb/connections.py in defaulterrorhandler(***failed resolving arguments***) 33 del cursor 34 del connection ---> 35 raise errorclass, errorvalue 36 37 OperationalError: (1054, "Unknown column 'U1.id' in 'on clause'") # Here is the query that django generates. As you can see, it tried to use the U1 alias for a table, which it did not create. 'SELECT `exclude_modeltwo`.`id`, `exclude_modeltwo`.`model_one_id` FROM `exclude_modeltwo` WHERE NOT (`exclude_modeltwo`.`model_one_id` IN (SELECT U2.`model_one_id` FROM `exclude_modeltwo` U0 INNER JOIN `exclude_modelthree` U2 ON (U1.`id` = U2.`model_one_id`) WHERE U2.`id` = %s ))'