El SQL para eliminar la restricción:
ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
O para alterarlo para permitir Polígonos y MultiPolígonos:
ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
ALTER TABLE myapp_mymodel ADD CONSTRAINT enforce_geotype_mygeom CHECK (geometrytype(mygeom) = 'POLYGON'::text OR geometrytype(mygeom) = 'MULTIPOLYGON'::text OR mygeom IS NULL);
Estas instrucciones SQL podrían ejecutarse desde una migración Sur o un script SQL de datos iniciales .
Otra opción es convertirlo en una GeometryField
definición de modelo de Django; esto le permitirá almacenar cualquier tipo de geometría.
O bien, anule el save()
método en su modelo para forzar que todo sea un MultiPolygon:
from django.contrib.gis.db import models
from django.contrib.gis import geos
class MyModel(models.Model):
mygeom = models.MultiPolygonField()
... other fields....
def save(self, *args, **kwargs):
# if mygeom ends up as a Polgon, make it into a MultiPolygon
if self.mygeom and isinstance(self.mygeom, geos.Polygon):
self.mygeom = geos.MultiPolygon(self.mygeom)
super(MyModel).save(*args, **kwargs)
solución larga
uno podría usar fromstr ()
fuente
Sé que esto es antiguo, pero me encontré con este problema y tuve problemas para usar las soluciones sugeridas anteriormente:
El uso
GeometryField
hace que sea difícil usar laOSMGeoAdmin
clase integrada . El código entemplates/gis/admin/openlayers.js
(ycontrib/gis/admin/widgets.py
probablemente en otros lugares que me perdí) frecuentemente asume que la geometría es un punto, línea, polígono o colección, y nunca da cuenta de geometrías genéricas. Esto no es necesariamente importante o insuperable, pero si estaba planeando usar el administrador incorporado, podría sentirse decepcionado.La anulación
save()
no funciona porque la verificación de tipo ocurre antes, en el modelo__set__()
.Mi solución actual está coaccionando explícitamente todos mis
Polygon
s enMultiPolygon
s al importar y guardar mis datos. Podría anular__set__()
si esto se vuelve engorroso.fuente