﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34838	GeoDjango database functions incompatible with GeneratedField	Paolo Melchiorre	Paolo Melchiorre	"GeoDjango model functions raise an incompatibility error when invoked on generated fields.

**Steps**

Steps to reproduce the error.

**Model**


{{{
from django.contrib.gis.db import models

class Area(models.Model):
    polygon = models.PolygonField()
    centroid = models.GeneratedField(
        db_persist=True,
        expression=models.functions.Centroid(""polygon""),
        output_field=models.PointField(),
    )
}}}

**Query**


{{{
>>> from django.contrib.gis.geos import Polygon
>>> Area.objects.create(polygon=Polygon(((0,0), (2,0), (2,2), (0,2), (0,0))))
>>> Area.objects.values_list(models.functions.AsWKT(""centroid""), models.functions.AsWKT(""polygon""))
}}}

**Traceback**


{{{
Traceback (most recent call last):
  File ""<console>"", line 1, in <module>
  File ""/home/paulox/Projects/django/django/db/models/manager.py"", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ""/home/paulox/Projects/django/django/db/models/query.py"", line 1629, in annotate
    return self._annotate(args, kwargs, select=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ""/home/paulox/Projects/django/django/db/models/query.py"", line 1677, in _annotate
    clone.query.add_annotation(
  File ""/home/paulox/Projects/django/django/db/models/sql/query.py"", line 1185, in add_annotation
    annotation = annotation.resolve_expression(self, allow_joins=True, reuse=None)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ""/home/paulox/Projects/django/django/contrib/gis/db/models/functions.py"", line 80, in resolve_expression
    raise TypeError(
TypeError: AsWKT function requires a GeometryField in position 1, got GeneratedField.
}}}

**Patch**


{{{
diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py
index 19da355d28..90ca87a051 100644
--- a/django/contrib/gis/db/models/functions.py
+++ b/django/contrib/gis/db/models/functions.py
@@ -76,6 +76,8 @@ class GeoFuncMixin:
         source_fields = res.get_source_fields()
         for pos in self.geom_param_pos:
             field = source_fields[pos]
+            if field.generated:
+                field = field.output_field
             if not isinstance(field, GeometryField):
                 raise TypeError(
                     ""%s function requires a GeometryField in position %s, got %s.""
@@ -86,7 +88,7 @@ class GeoFuncMixin:
                     )
                 )
 
-        base_srid = res.geo_field.srid
+        base_srid = res.geo_field.srid if not res.geo_field.generated else res.geo_field.output_field.srid
         for pos in self.geom_param_pos[1:]:
             expr = res.source_expressions[pos]
             expr_srid = expr.output_field.srid
}}}

"	Bug	closed	Database layer (models, ORM)	dev	Release blocker	fixed	field, database, generated, output_field		Ready for checkin	1	0	0	0	0	0
