#34957: Cannot filter over annotated "FilteredRelation" since Django 5
-------------------------------+--------------------------------------
     Reporter:  younes-chaoui  |                    Owner:  nobody
         Type:  Bug            |                   Status:  new
    Component:  Uncategorized  |                  Version:  5.0
     Severity:  Normal         |               Resolution:
     Keywords:                 |             Triage Stage:  Unreviewed
    Has patch:  0              |      Needs documentation:  0
  Needs tests:  0              |  Patch needs improvement:  0
Easy pickings:  0              |                    UI/UX:  0
-------------------------------+--------------------------------------
Description changed by younes-chaoui:

Old description:

> After updating  to django 5.0b1 I get exceptions when filtering over
> annotated "FilteredRelation".
>
> This is an example to reproduce it :
>
> {{{
> from django.db.models import F, FilteredRelation, Q
> visites = (
>     Visite.objects.all()
>     .annotate(
>         etat_at_date_de_visite=FilteredRelation(
>             "site__siteusage__etats",
> condition=Q(site__siteusage__etats__date_valeur=F("date_de_visite")),
>         )
>     )
>     .filter(etat_at_date_de_visite__isnull=False)
> )
> print(visites)
> }}}
>
> **Tracelog**
>
> {{{
>  File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1913, in setup_joins
>     alias = self.join(connection, reuse=reuse)
>             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1133, in join
>     join.filtered_relation = filtered_relation.resolve_expression(
>                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/query_utils.py",
> line 463, in resolve_expression
>     clone.resolved_condition = query.build_filter(
>                                ^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1458, in build_filter
>     return self._add_q(
>            ^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1631, in _add_q
>     child_clause, needed_inner = self.build_filter(
>                                  ^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1481, in build_filter
>     lookups, parts, reffed_expression = self.solve_lookup_type(arg,
> summarize)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1293, in solve_lookup_type
>     _, field, _, lookup_parts = self.names_to_path(lookup_splitted,
> self.get_meta())
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py",
> line 1774, in names_to_path
>     pathinfos = field.get_path_info(filtered_relation)
>                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-
> packages/django/db/models/fields/reverse_related.py", line 241, in
> get_path_info
>     return self.field.get_reverse_path_info(filtered_relation)
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/younes/.local/share/virtualenvs/new-p1-back-
> ouzi8-CM/lib/python3.11/site-
> packages/django/db/models/fields/related.py", line 862, in
> get_reverse_path_info
>     PathInfo(
>   File "<string>", line 1, in <lambda>
> RecursionError: maximum recursion depth exceeded while calling a Python
> object
> }}}

New description:

 After updating  to django 5.0b1 I get **RecursionError** when filtering
 over annotated "FilteredRelation".

 This is an example to reproduce it :

 {{{
 from django.db.models import F, FilteredRelation, Q
 visites = (
     Visite.objects.all()
     .annotate(
         etat_at_date_de_visite=FilteredRelation(
             "site__siteusage__etats",
 condition=Q(site__siteusage__etats__date_valeur=F("date_de_visite")),
         )
     )
     .filter(etat_at_date_de_visite__isnull=False)
 )
 print(visites)
 }}}

 **Tracelog**

 {{{
  File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1913, in setup_joins
     alias = self.join(connection, reuse=reuse)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1133, in join
     join.filtered_relation = filtered_relation.resolve_expression(
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/query_utils.py",
 line 463, in resolve_expression
     clone.resolved_condition = query.build_filter(
                                ^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1458, in build_filter
     return self._add_q(
            ^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1631, in _add_q
     child_clause, needed_inner = self.build_filter(
                                  ^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1481, in build_filter
     lookups, parts, reffed_expression = self.solve_lookup_type(arg,
 summarize)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1293, in solve_lookup_type
     _, field, _, lookup_parts = self.names_to_path(lookup_splitted,
 self.get_meta())
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/sql/query.py", line
 1774, in names_to_path
     pathinfos = field.get_path_info(filtered_relation)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-
 packages/django/db/models/fields/reverse_related.py", line 241, in
 get_path_info
     return self.field.get_reverse_path_info(filtered_relation)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/younes/.local/share/virtualenvs/new-p1-back-
 ouzi8-CM/lib/python3.11/site-packages/django/db/models/fields/related.py",
 line 862, in get_reverse_path_info
     PathInfo(
   File "<string>", line 1, in <lambda>
 RecursionError: maximum recursion depth exceeded while calling a Python
 object
 }}}

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34957#comment:5>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018bae6fe494-92f5707f-0473-48b8-b432-f82ac36accf8-000000%40eu-central-1.amazonses.com.

Reply via email to