#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 django-updates+unsubscr...@googlegroups.com. 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.