# 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/<ipython console> in <module>()

/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 ))'
