Kod SQL do usunięcia ograniczenia:
ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
Lub zmień go, aby zezwolił zarówno na wielokąty, jak i na wielokąty:
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);
Te instrukcje SQL można uruchomić z migracji południowej lub ze skryptu SQL danych początkowych .
Inną opcją jest ustawienie go GeometryField
w definicji modelu Django - pozwoli to na przechowywanie dowolnego typu geometrii.
Lub zastąp save()
metodę w swoim modelu, aby wymusić, aby wszystko było 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)
długotrwałe obejście
można użyć fromstr ()
źródło
Wiem, że to stare, ale sam wpadłem na ten problem i miałem problemy z użyciem wyżej sugerowanych rozwiązań:
Używanie
GeometryField
utrudnia korzystanie z wbudowanejOSMGeoAdmin
klasy. Kod wtemplates/gis/admin/openlayers.js
(icontrib/gis/admin/widgets.py
prawdopodobnie w innych miejscach, za którymi tęskniłem) często zakłada, że geometria to punkt, linia, wielokąt lub zbiór i nigdy nie uwzględnia ogólnych geometrii. Niekoniecznie jest to ważne lub nie do pokonania, ale jeśli planujesz korzystać z wbudowanego administratora, możesz być rozczarowany.Przesłanianie
save()
nie działa, ponieważ sprawdzanie typu odbywa się wcześniej w modelu__set__()
.Moje obecne rozwiązanie wyraźnie zmusza wszystkie moje
Polygon
pliki doMultiPolygon
importowania i zapisywania moich danych. Mogę to zmienić,__set__()
jeśli stanie się to uciążliwe.źródło