Opened 2 years ago
Closed 2 years ago
#34629 closed New feature (fixed)
AttributeError when using filter argument with Collect in GeoDjango Aggregate
| Reported by: | Olivier Le Thanh Duong | Owned by: | Olivier Le Thanh Duong |
|---|---|---|---|
| Component: | GIS | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Ready for checkin | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
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:
- Define the
FormandSubmissionmodels as follows: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)
- Execute the following query to annotate the
submission_centerusingCollect, applying a filter to only include undeleted submissions: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
Change History (9)
comment:1 by , 2 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:3 by , 2 years ago
| Type: | Bug → New feature |
|---|
comment:4 by , 2 years ago
| Needs documentation: | set |
|---|---|
| Needs tests: | set |
| Patch needs improvement: | set |
comment:5 by , 2 years ago
| Needs documentation: | unset |
|---|
comment:6 by , 2 years ago
| Needs tests: | unset |
|---|
comment:7 by , 2 years ago
| Patch needs improvement: | unset |
|---|---|
| Triage Stage: | Accepted → Ready for checkin |
Corresponding Pull request: https://github.com/django/django/pull/16939