Answers:
删除约束的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语句可以从South迁移或初始数据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)
我知道这很旧,但是我自己遇到了这个问题,使用上述建议的解决方案时遇到了问题:
使用GeometryField
使得难以使用内置OSMGeoAdmin
类。在templates/gis/admin/openlayers.js
(以及contrib/gis/admin/widgets.py
我可能错过的其他地方)中的代码经常假定几何是点,线,多边形或集合,并且从不考虑通用几何。这不一定重要或不可克服,但是如果您打算使用内置管理员,则可能会感到失望。
覆盖save()
无效,因为类型检查会在模型的中进行得更快__set__()
。
我当前的解决方案是在导入和保存数据时将所有Polygon
s 强制转换为MultiPolygon
s。__set__()
如果这变得麻烦,我可能会重写。