Fixed #26789 -- Fixed handling of empty geometries in BaseSpatialField.get_db_prep_save().
This commit is contained in:
parent
b90d72facf
commit
183f501540
|
@ -26,6 +26,8 @@ class BaseSpatialFeatures(object):
|
|||
supports_real_shape_operations = True
|
||||
# Can geometry fields be null?
|
||||
supports_null_geometries = True
|
||||
# Are empty geometries supported?
|
||||
supports_empty_geometries = False
|
||||
# Can the the function be applied on geodetic coordinate systems?
|
||||
supports_distance_geodetic = True
|
||||
supports_length_geodetic = True
|
||||
|
|
|
@ -8,3 +8,4 @@ class DatabaseFeatures(BaseSpatialFeatures, Psycopg2DatabaseFeatures):
|
|||
supports_3d_functions = True
|
||||
supports_left_right_lookups = True
|
||||
supports_raster = True
|
||||
supports_empty_geometries = True
|
||||
|
|
|
@ -177,10 +177,10 @@ class BaseSpatialField(Field):
|
|||
"""
|
||||
Prepare the value for saving in the database.
|
||||
"""
|
||||
if not value:
|
||||
return None
|
||||
else:
|
||||
if isinstance(value, Geometry) or value:
|
||||
return connection.ops.Adapter(self.get_prep_value(value))
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_raster_prep_value(self, value, is_candidate):
|
||||
"""
|
||||
|
|
|
@ -6,8 +6,8 @@ import tempfile
|
|||
from django.contrib.gis import gdal
|
||||
from django.contrib.gis.db.models import Extent, MakeLine, Union
|
||||
from django.contrib.gis.geos import (
|
||||
GeometryCollection, GEOSGeometry, LinearRing, LineString, Point, Polygon,
|
||||
fromstr,
|
||||
GeometryCollection, GEOSGeometry, LinearRing, LineString, MultiLineString,
|
||||
MultiPoint, MultiPolygon, Point, Polygon, fromstr,
|
||||
)
|
||||
from django.core.management import call_command
|
||||
from django.db import connection
|
||||
|
@ -215,6 +215,29 @@ class GeoModelTest(TestCase):
|
|||
call_command('loaddata', tmp.name, verbosity=0)
|
||||
self.assertListEqual(original_data, list(City.objects.all().order_by('name')))
|
||||
|
||||
@skipUnlessDBFeature("supports_empty_geometries")
|
||||
def test_empty_geometries(self):
|
||||
geometry_classes = [
|
||||
Point,
|
||||
LineString,
|
||||
LinearRing,
|
||||
Polygon,
|
||||
MultiPoint,
|
||||
MultiLineString,
|
||||
MultiPolygon,
|
||||
GeometryCollection,
|
||||
]
|
||||
for klass in geometry_classes:
|
||||
g = klass(srid=4326)
|
||||
feature = Feature.objects.create(name='Empty %s' % klass.__name__, geom=g)
|
||||
feature.refresh_from_db()
|
||||
if klass is LinearRing:
|
||||
# LinearRing isn't representable in WKB, so GEOSGeomtry.wkb
|
||||
# uses LineString instead.
|
||||
g = LineString(srid=4326)
|
||||
self.assertEqual(feature.geom, g)
|
||||
self.assertEqual(feature.geom.srid, g.srid)
|
||||
|
||||
|
||||
@skipUnlessDBFeature("gis_enabled")
|
||||
class GeoLookupTest(TestCase):
|
||||
|
|
Loading…
Reference in New Issue