Die SQL zum Löschen der Einschränkung:
ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
Oder um es zu ändern, um sowohl Polygone als auch MultiPolygone zuzulassen:
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);
Diese SQL-Anweisungen können über eine South-Migration oder ein SQL-Skript mit Anfangsdaten ausgeführt werden .
Eine andere Möglichkeit besteht darin, es GeometryField
in Ihre Django-Modelldefinition aufzunehmen. Dadurch kann es jeden Geometrietyp speichern.
Oder überschreiben Sie die save()
Methode in Ihrem Modell, um zu erzwingen, dass alles ein MultiPolygon ist:
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)
längere Problemumgehung
man könnte fromstr () verwenden
quelle
Ich weiß, dass dies alt ist, aber ich bin gerade selbst auf dieses Problem gestoßen und hatte Probleme mit den oben vorgeschlagenen Lösungen:
Die Verwendung
GeometryField
macht es schwierig, die integrierteOSMGeoAdmin
Klasse zu verwenden. Der Code antemplates/gis/admin/openlayers.js
(undcontrib/gis/admin/widgets.py
wahrscheinlich an anderen Stellen, die ich verpasst habe) geht häufig davon aus, dass die Geometrie ein Punkt, eine Linie, ein Polygon oder eine Sammlung ist und niemals generische Geometrien berücksichtigt. Dies ist nicht unbedingt wichtig oder unüberwindbar, aber wenn Sie vorhaben, den integrierten Administrator zu verwenden, werden Sie möglicherweise enttäuscht sein.Das Überschreiben
save()
funktioniert nicht, da die Typprüfung im Modell früher erfolgt__set__()
.Meine aktuelle Lösung besteht darin, beim Importieren und Speichern meiner Daten alle meine
Polygon
s explizit inMultiPolygon
s zu zwingen . Ich könnte überschreiben,__set__()
wenn dies umständlich wird.quelle