#34629: AttributeError when using filter argument with Collect in GeoDjango
Aggregate
--------------------------------------------------+------------------------
               Reporter:  Olivier Le Thanh Duong  |          Owner:  nobody
                   Type:  Bug                     |         Status:  new
              Component:  GIS                     |        Version:  dev
               Severity:  Normal                  |       Keywords:
           Triage Stage:  Unreviewed              |      Has patch:  1
    Needs documentation:  0                       |    Needs tests:  0
Patch needs improvement:  0                       |  Easy pickings:  0
                  UI/UX:  0                       |
--------------------------------------------------+------------------------
 When using the `django.contrib.gis.db.models.aggregates.Collect` aggregate
 function in GeoDjango, a `AttributeError` is raised when a filter argument
 is passed. The error is in GeoAggregate so I believe it affect all the
 other GeoAggregate: MakeLine, Union, Extend and Extent3D

 Reproduction Steps:
 1. Define the `Form` and `Submission` models as follows:
 {{{#!python
 from django.contrib.gis.db.models import PointField
 from django.db import models

 class Form(models.Model):
     name = models.TextField()

 class Submission(models.Model):
     location = PointField()
     name = models.ForeignKey(Form, on_delete=models.CASCADE)
     deleted = models.BooleanField(default=False)
 }}}
 2. Execute the following query to annotate the `submission_center` using
 `Collect`, applying a filter to only include undeleted submissions:
 {{{#!python
 Form.objects.annotate(submission_locations=Collect('submission__location',
 filter=Q(deleted=False)))
 }}}

 Expected Result:
 The query should execute successfully, annotating the `submission_center`
 field in the `Form` model with the collected locations of undeleted
 submissions.

 Actual Result:
 An `AttributeError` is raised with the following traceback:
 {{{
 File ~/.virtualenvs/iaso/lib/python3.8/site-
 packages/django/contrib/gis/db/models/aggregates.py:44, in
 GeoAggregate.resolve_expression(self, query, allow_joins, reuse,
 summarize, for_save)
      42 c = super().resolve_expression(query, allow_joins, reuse,
 summarize, for_save)
      43 for expr in c.get_source_expressions():
 ---> 44     if not hasattr(expr.field, 'geom_type'):
      45         raise ValueError('Geospatial aggregates only allowed on
 geometry fields.')
      46 return c

 AttributeError: 'WhereNode' object has no attribute 'field'
 }}}

 Versions Affected:
 This issue can be reproduced on Django versions 3.2.15 and the main branch
 (1136aa5005f0ae70fea12796b7e37d6f027b9263 of 3 June). The Git log suggests
 that this problem exists in all versions between the reported ones.

 I have a the working of a patch and will open a corresponding pull request
 in GitHub

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34629>
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/0107018880da7c36-3f0f6592-773c-41ae-b388-f77a54485b21-000000%40eu-central-1.amazonses.com.

Reply via email to