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