#34931: QuerySet .count() crashes when queryset contains FilteredRelation
referencing annotation in condition
-------------------------------------+-------------------------------------
               Reporter:  Ben Nace   |          Owner:  nobody
                   Type:  Bug        |         Status:  new
              Component:  Database   |        Version:  4.2
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 With the following models:

 {{{
 from django.db import models


 class ModelA(models.Model):
     threshold1 = models.PositiveIntegerField()
     threshold2 = models.PositiveIntegerField()


 class ModelB(models.Model):
     model_a = models.ForeignKey(ModelA, on_delete=models.CASCADE)
     value = models.IntegerField()
 }}}

 Attempting the following query results in a FieldError:

 {{{
 from django.db.models import F, FilteredRelation, Q
 ModelA.objects.annotate(combined_threshold=F('threshold1') +
 F('threshold2'), filtered_b=FilteredRelation('modelb',
 
condition=Q(modelb__value__gte=F('combined_threshold')))).values('filtered_b__value').count()
 }}}

 {{{
 Traceback (most recent call last):
   File "<console>", line 1, in <module>
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/query.py", line 608, in count
     return self.query.get_count(using=self.db)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 568, in get_count
     return obj.get_aggregation(using, {"__count": Count("*")})["__count"]
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 554, in get_aggregation
     result = compiler.execute_sql(SINGLE)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/compiler.py", line 1549, in execute_sql
     sql, params = self.as_sql()
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/compiler.py", line 761, in as_sql
     from_, f_params = self.get_from_clause()
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/compiler.py", line 1128, in get_from_clause
     clause_sql, clause_params = self.compile(from_clause)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/compiler.py", line 546, in compile
     sql, params = node.as_sql(self, self.connection)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/datastructures.py", line 105, in as_sql
     extra_sql, extra_params = compiler.compile(self.filtered_relation)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/compiler.py", line 546, in compile
     sql, params = node.as_sql(self, self.connection)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/query_utils.py", line 434, in as_sql
     where = query.build_filtered_relation_q(self.condition,
 reuse=set(self.path))
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 1609, in
 build_filtered_relation_q
     child_clause, _ = self.build_filter(
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 1435, in build_filter
     value = self.resolve_lookup_value(value, can_reuse, allow_joins)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 1204, in
 resolve_lookup_value
     value = value.resolve_expression(
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/expressions.py", line 822, in resolve_expression
     return query.resolve_ref(self.name, allow_joins, reuse, summarize)
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 1976, in resolve_ref
     join_info = self.setup_joins(
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 1823, in setup_joins
     path, final_field, targets, rest = self.names_to_path(
   File "/home/bnace/python-envs/pmcs-42/lib/python3.9/site-
 packages/django/db/models/sql/query.py", line 1724, in names_to_path
     raise FieldError(
 django.core.exceptions.FieldError: Cannot resolve keyword
 'combined_threshold' into field. Choices are: __count, filtered_b, id,
 modelb, threshold1, threshold2
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34931>
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/0107018b6d3ef9a7-73cdd0b3-3c5e-489e-8b8c-28dd04b6198f-000000%40eu-central-1.amazonses.com.

Reply via email to