mirror of
https://github.com/django/django.git
synced 2025-03-03 05:24:24 +00:00
Fixed #25708 -- Fixed annotations with geometry values.
This commit is contained in:
parent
4a246a02bd
commit
f909fa84be
@ -312,6 +312,12 @@ class GeometryField(GeoSelectFormatMixin, BaseSpatialField):
|
|||||||
"""
|
"""
|
||||||
return connection.ops.get_distance(self, value, lookup_type)
|
return connection.ops.get_distance(self, value, lookup_type)
|
||||||
|
|
||||||
|
def get_db_prep_value(self, value, connection, *args, **kwargs):
|
||||||
|
return connection.ops.Adapter(
|
||||||
|
super(GeometryField, self).get_db_prep_value(value, connection, *args, **kwargs),
|
||||||
|
**({'geography': True} if self.geography else {})
|
||||||
|
)
|
||||||
|
|
||||||
def from_db_value(self, value, expression, connection, context):
|
def from_db_value(self, value, expression, connection, context):
|
||||||
if value:
|
if value:
|
||||||
if not isinstance(value, Geometry):
|
if not isinstance(value, Geometry):
|
||||||
|
@ -579,6 +579,8 @@ class Value(Expression):
|
|||||||
val = self.output_field.get_db_prep_save(val, connection=connection)
|
val = self.output_field.get_db_prep_save(val, connection=connection)
|
||||||
else:
|
else:
|
||||||
val = self.output_field.get_db_prep_value(val, connection=connection)
|
val = self.output_field.get_db_prep_value(val, connection=connection)
|
||||||
|
if hasattr(self._output_field, 'get_placeholder'):
|
||||||
|
return self._output_field.get_placeholder(val, compiler, connection), [val]
|
||||||
if val is None:
|
if val is None:
|
||||||
# cx_Oracle does not always convert None to the appropriate
|
# cx_Oracle does not always convert None to the appropriate
|
||||||
# NULL type (like in case expressions using numbers), so we
|
# NULL type (like in case expressions using numbers), so we
|
||||||
|
31
tests/gis_tests/geoapp/test_expressions.py
Normal file
31
tests/gis_tests/geoapp/test_expressions.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
from unittest import skipUnless
|
||||||
|
|
||||||
|
from django.contrib.gis.db.models import GeometryField, Value, functions
|
||||||
|
from django.contrib.gis.geos import Point, Polygon
|
||||||
|
from django.test import TestCase, skipUnlessDBFeature
|
||||||
|
|
||||||
|
from ..utils import postgis
|
||||||
|
from .models import City
|
||||||
|
|
||||||
|
|
||||||
|
@skipUnlessDBFeature('gis_enabled')
|
||||||
|
class GeoExpressionsTests(TestCase):
|
||||||
|
fixtures = ['initial']
|
||||||
|
|
||||||
|
def test_geometry_value_annotation(self):
|
||||||
|
p = Point(1, 1, srid=4326)
|
||||||
|
point = City.objects.annotate(p=Value(p, GeometryField(srid=4326))).first().p
|
||||||
|
self.assertEqual(point, p)
|
||||||
|
|
||||||
|
@skipUnlessDBFeature('supports_transform')
|
||||||
|
def test_geometry_value_annotation_different_srid(self):
|
||||||
|
p = Point(1, 1, srid=32140)
|
||||||
|
point = City.objects.annotate(p=Value(p, GeometryField(srid=4326))).first().p
|
||||||
|
self.assertTrue(point.equals_exact(p.transform(4326, clone=True), 10 ** -5))
|
||||||
|
self.assertEqual(point.srid, 4326)
|
||||||
|
|
||||||
|
@skipUnless(postgis, 'Only postgis has geography fields.')
|
||||||
|
def test_geography_value(self):
|
||||||
|
p = Polygon(((1, 1), (1, 2), (2, 2), (2, 1), (1, 1)))
|
||||||
|
area = City.objects.annotate(a=functions.Area(Value(p, GeometryField(srid=4326, geography=True)))).first().a
|
||||||
|
self.assertAlmostEqual(area.sq_km, 12305.1, 0)
|
Loading…
x
Reference in New Issue
Block a user