Opened 2 months ago

Last modified 2 months ago

#31714 new Cleanup/optimization

ResolvedOuterRef object has no get_lookup

Reported by: BorisZZZ Owned by: nobody
Component: Database layer (models, ORM) Version: 3.0
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

This looks like an issue very similar to #28621, only in this case the issue is cause by using the annotation on the LHS of a filter.
For example,

class A(models.Model):
    r = IntegerRangeField()
      
A.objects.annotate(x=OuterRef("x")).filter(x__contained_in=F("r"))

will result in the following stack trace:

Traceback (most recent call last):
  ...
  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 904, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 923, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1350, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1377, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1267, in build_filter
    condition = self.build_lookup(lookups, reffed_expression, value)
  File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1153, in build_lookup
    lookup_class = lhs.get_lookup(lookup_name)
AttributeError: 'ResolvedOuterRef' object has no attribute 'get_lookup'

Change History (1)

comment:1 Changed 2 months ago by Simon Charette

Triage Stage: UnreviewedAccepted
Type: BugCleanup/optimization

I think we could error out which a more appropriate message but it will be very hard to make the above queryset work since OuterRef cannot be resolved to a proper output_field until its queryset gets annotated to an outer query. I guess we could allow an output_field to be specified on OuterRef initialization to allow filter to reference it before it's resolved to a Col.

Note: See TracTickets for help on using tickets.
Back to Top