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.
* owner: nobody => Olivier Le Thanh Duong
* status: new => assigned
Comment:
Corresponding Pull request: https://github.com/django/django/pull/16939
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:1>
* stage: Unreviewed => Accepted
Comment:
Good catch!
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:2>
* type: Bug => New feature
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:3>
* needs_better_patch: 0 => 1
* needs_tests: 0 => 1
* needs_docs: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:4>
* needs_docs: 1 => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:5>
* needs_tests: 1 => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:6>
* needs_better_patch: 1 => 0
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:7>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"1b754d638dc5682265b5b4d1fcf5a94d0312113e" 1b754d63]:
{{{
#!CommitTicketReference repository=""
revision="1b754d638dc5682265b5b4d1fcf5a94d0312113e"
Fixed #34629 -- Added filtering support to GIS aggregates.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:9>
Comment (by Mariusz Felisiak <felisiak.mariusz@…>):
In [changeset:"c1cff3c4715f633b5123d32227af5104f8585fc7" c1cff3c4]:
{{{
#!CommitTicketReference repository=""
revision="c1cff3c4715f633b5123d32227af5104f8585fc7"
Refs #34629 -- Changed SDOAGGRTYPE wrapping to Func() in GIS aggregates on
Oracle.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/34629#comment:8>