﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
28442	Error creating queryset with nested OuterRefs on a foreign key	Abram Booth	Oliver Sauder	"Given a model like:
{{{#!python
class Agent(models.Model):
    agency = models.ForeignKey('Agency')
    ...
}}}
Trying to make a queryset for use in a nested subquery will fail (traceback+error below):
{{{#!python
q = Agent.objects.filter(agency_id=OuterRef(OuterRef('id')))
}}}
Tested in 1.11.1 and 1.11.3. Nested OuterRefs work fine with other types of fields.

Traceback:
{{{
[...]/django/db/models/manager.py in manager_method(self, *args, **kwargs)                                                                                                           
     83         def create_method(name, method):
     84             def manager_method(self, *args, **kwargs):                                                                                                                       
---> 85                 return getattr(self.get_queryset(), name)(*args, **kwargs)                                                                                                   
     86             manager_method.__name__ = method.__name__                                                                                                                        
     87             manager_method.__doc__ = method.__doc__                                                                                                                          

[...]/django/db/models/query.py in filter(self, *args, **kwargs)                                                                                                                     
    782         set.                                                                                                                                                                 
    783         """"""
--> 784         return self._filter_or_exclude(False, *args, **kwargs)
    785 
    786     def exclude(self, *args, **kwargs):                                                                                                                                      
    
[...]/django/db/models/query.py in _filter_or_exclude(self, negate, *args, **kwargs)                                                                                                 
    800             clone.query.add_q(~Q(*args, **kwargs))
    801         else:                                                                                                                                                                
--> 802             clone.query.add_q(Q(*args, **kwargs))                                                                                                                            
    803         return clone
    804                       
                                                                                                                                                                                     
[...]/django/db/models/sql/query.py in add_q(self, q_object)                                                                                                                         
   1248         existing_inner = set(                                                                                                                                                
   1249             (a for a in self.alias_map if self.alias_map[a].join_type == INNER))                                                                                             
-> 1250         clause, _ = self._add_q(q_object, self.used_aliases)                                                                                                                 
   1251         if clause:                                                                                                                                                           
   1252             self.where.add(clause, AND)
        
[...]/django/db/models/sql/query.py in _add_q(self, q_object, used_aliases, branch_negated, current_negated, allow_joins, split_subq)                                                
   1274                     child, can_reuse=used_aliases, branch_negated=branch_negated,
   1275                     current_negated=current_negated, connector=connector,                                                                                                    
-> 1276                     allow_joins=allow_joins, split_subq=split_subq,                                                                                                          
   1277                 )
   1278                 joinpromoter.add_votes(needed_inner)
                
[...]/django/db/models/sql/query.py in build_filter(self, filter_expr, branch_negated, current_negated, can_reuse, connector, allow_joins, split_subq)                               
   1204             else:
   1205                 lhs = MultiColSource(alias, targets, sources, field)                                                                                                         
-> 1206             condition = lookup_class(lhs, value)                                                                                                                             
   1207             lookup_type = lookup_class.lookup_name                                                                                                                           
   1208         else:                                                                                                                                                                
                                                                                                                                                                                     
[...]/django/db/models/lookups.py in __init__(self, lhs, rhs)                                                                                                                        
     22     def __init__(self, lhs, rhs):                                                                                                                                            
     23         self.lhs, self.rhs = lhs, rhs
---> 24         self.rhs = self.get_prep_lookup()
     25         if hasattr(self.lhs, 'get_bilateral_transforms'):
     26             bilateral_transforms = self.lhs.get_bilateral_transforms()
            
[...]/django/db/models/fields/related_lookups.py in get_prep_lookup(self)
    110                 # as we don't get to the direct value branch otherwise.                                                                                                      
    111                 target_field = self.lhs.output_field.get_path_info()[-1].target_fields[-1]                                                                                   
--> 112                 self.rhs = target_field.get_prep_value(self.rhs)
    113         
    114         return super(RelatedLookupMixin, self).get_prep_lookup()
                
[...]/django/db/models/fields/__init__.py in get_prep_value(self, value)                                                                                                             
    964         if value is None:                                                                                                                                                    
    965             return None
--> 966         return int(value)
    967     
    968     def contribute_to_class(self, cls, name, **kwargs):
            
TypeError: int() argument must be a string, a bytes-like object or a number, not 'OuterRef'
}}}"	Bug	closed	Database layer (models, ORM)	1.11	Normal	fixed		Oliver Sauder	Accepted	1	0	0	0	0	0
