diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py index 3dd8efaa22..04e81e5428 100644 --- a/django/contrib/gis/db/models/functions.py +++ b/django/contrib/gis/db/models/functions.py @@ -253,15 +253,13 @@ class DistanceResultMixin: def convert_value(self, value, expression, connection, context): if value is None: return None + dist_att = None geo_field = self.geo_field if geo_field.geodetic(connection): - dist_att = 'm' + if connection.features.supports_distance_geodetic: + dist_att = 'm' else: - units = geo_field.units_name(connection) - if units: - dist_att = DistanceMeasure.unit_attname(units) - else: - dist_att = None + dist_att = geo_field.units_name(connection) if dist_att: return DistanceMeasure(**{dist_att: value}) return value diff --git a/tests/gis_tests/distapp/tests.py b/tests/gis_tests/distapp/tests.py index 31987d9ce8..aafd5f8035 100644 --- a/tests/gis_tests/distapp/tests.py +++ b/tests/gis_tests/distapp/tests.py @@ -5,7 +5,7 @@ from django.contrib.gis.geos import GEOSGeometry, LineString, Point from django.contrib.gis.measure import D # alias for Distance from django.db import connection from django.db.models import F, Q -from django.test import TestCase, skipUnlessDBFeature +from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature from ..utils import no_oracle, oracle, postgis, spatialite from .models import ( @@ -360,6 +360,14 @@ class DistanceFunctionsTests(TestCase): for i, c in enumerate(qs): self.assertAlmostEqual(sphere_distances[i], c.distance.m, tol) + @skipIfDBFeature("supports_distance_geodetic") + @skipUnlessDBFeature("has_Distance_function") + def test_distance_function_raw_result(self): + distance = Interstate.objects.annotate( + d=Distance(Point(0, 0, srid=4326), Point(0, 1, srid=4326)), + ).first().d + self.assertEqual(distance, 1) + @no_oracle # Oracle already handles geographic distance calculation. @skipUnlessDBFeature("has_Distance_function", 'has_Transform_function') def test_distance_transform(self):