O SQL para eliminar a restrição:
ALTER TABLE myapp_mymodel DROP CONSTRAINT enforce_geotype_mygeom;
Ou altere-o para permitir Polígonos e MultiPolígonos:
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);
Essas instruções SQL podem ser executadas a partir de uma migração do Sul ou de um script SQL de dados iniciais .
Outra opção é transformá-lo GeometryField
em sua definição de modelo do Django - isso permitirá armazenar qualquer tipo de geometria.
Ou substitua o save()
método no seu modelo para forçar tudo a ser um 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)
solução alternativa demorada
alguém poderia usar fromstr ()
fonte
Sei que isso é antigo, mas acabei de me deparar com esse problema e tive problemas ao usar as soluções sugeridas acima:
O uso
GeometryField
dificulta o uso daOSMGeoAdmin
classe interna. O códigotemplates/gis/admin/openlayers.js
(econtrib/gis/admin/widgets.py
provavelmente outros lugares que eu perdi) freqüentemente pressupõe que a geometria é um ponto, linha, polígono ou coleção e nunca é responsável por geometrias genéricas. Isso não é necessariamente importante ou intransponível, mas se você planeja usar o administrador interno, pode se decepcionar.A substituição
save()
não funciona porque a verificação de tipo acontece mais cedo, no modelo__set__()
.Minha solução atual é explicitamente coagir todos os meus
Polygon
s emMultiPolygon
s ao importar e salvar meus dados. Eu poderia substituir__set__()
se isso se tornar complicado.fonte