SQL для удаления ограничения:
ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
Или изменить его, чтобы разрешить как полигоны, так и мультиполигоны:
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);
Эти операторы SQL могут быть выполнены из миграции на юг или сценария SQL с исходными данными .
Другой вариант - включить его GeometryField
в определение модели Django - это позволит хранить любой тип геометрии.
Или переопределите save()
метод в вашей модели, чтобы заставить все быть 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)
длинный обходной путь
можно использовать fromstr ()
источник
Я знаю, что это старая версия, но я сам столкнулся с этой проблемой и столкнулся с проблемами при использовании предложенных выше решений:
Использование
GeometryField
затрудняет использование встроенногоOSMGeoAdmin
класса. Код вtemplates/gis/admin/openlayers.js
(и,contrib/gis/admin/widgets.py
возможно, в других местах, которые я пропустил) часто предполагает, что геометрия является точкой, линией, многоугольником или коллекцией, и никогда не учитывает общие геометрии. Это не обязательно важно или непреодолимо, но если вы планируете использовать встроенного администратора, вы можете быть разочарованы.Переопределение
save()
не работает, потому что проверка типа происходит раньше, в модели__set__()
.Мое текущее решение явно принуждает все мои
Polygon
s кMultiPolygon
импорту и сохранению моих данных. Я мог бы переопределить,__set__()
если это становится громоздким.источник