답변:
제약 조건을 삭제하는 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 migration 또는 초기 데이터 SQL 스크립트 에서 실행할 수 있습니다 .
또 다른 옵션은 GeometryField
장고 모델 정의에서 그것을 만드는 것입니다 -이것은 모든 기하학 유형을 저장할 수있게 해줍니다.
또는 save()
모델 의 메소드를 재정 의하여 모든 것을 다중 다각형으로 만듭니다.
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 ()을 사용할 수 있습니다
from django.contrib.gis.geos import fromstr
p = Polygon()
# this seems to work correctly
mp = MultiPolygon(fromstr(str(p)),)
model1.geom_field = mp
model1.save()
나는 이것이 오래되었다는 것을 알고 있지만 방금이 문제에 부딪 쳤고 위의 제안 된 솔루션을 사용하는 데 문제가있었습니다.
사용 GeometryField
하면 내장 OSMGeoAdmin
클래스 를 사용하기가 어렵습니다 . 코드 templates/gis/admin/openlayers.js
(그리고 contrib/gis/admin/widgets.py
아마도 내가 놓친 다른 장소) 의 코드 는 기하학이 점, 선, 다각형 또는 모음이라고 가정하고 일반적인 기하학을 설명하지 않습니다. 반드시 중요하거나 극복 할 수있는 것은 아니지만 내장 관리자를 사용하려는 경우 실망 할 수 있습니다.
save()
모델의 형식 검사가 더 빨리 이루어지기 때문에 재정의 가 작동하지 않습니다 __set__()
.
나의 현재 솔루션은 명시 적으로 내 모든 강요되는 Polygon
으로의를 MultiPolygon
가져올 때의 내 데이터를 저장. __set__()
이것이 성가신 경우 무시할 수 있습니다 .