#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.