带有south的geoDjango会导致spacelight db出现“重复列名错误”

2024-05-20 15:27:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有geodjango的自定义字段:

from django.contrib.gis.db import models as geomodels

class PointField(geomodels.PointField):
    def formfield(self, **kwargs):
        defaults = {
            'form_class': CustomFormField
        }
        defaults.update(kwargs)
        return super(PointField, self).formfield(**defaults)


try:
    from south.modelsinspector import add_introspection_rules
    from south.introspection_plugins.geodjango import rules

    add_introspection_rules(rules, ["^project\.apps\.appname\.fields\.PointField"])
except ImportError:
    pass

Django南部移民:

^{pr2}$

当执行此迁移时,我得到错误:

AddGeometryColumn() error: "duplicate column name: geoposition"
CreateSpatialIndex() error: either "company_address"."geoposition" isn't a Geometry column or a SpatialIndex is already defined

我已经没有主意了,不知道怎么解决这个问题。在

软件:

  • 丹戈1.4
  • 空间光3.0.1
  • gdal 1.9.2
  • 南0.7.6

数据库的地理元数据已初始化:

subprocess.call(["spatialite", settings.DATABASES['default']['NAME'], "SELECT InitSpatialMetaData();"])

并添加了srs条目:

from django.contrib.gis.utils import add_srs_entry
add_srs_entry(900913)

当我禁用迁移时没有出错。禁用迁移的代码:

SOUTH_MIGRATION_MODULES = {
    'appname': 'ignore',
}

但我需要一切都能很好地适应迁移。你知道是什么导致了这个问题吗?在


Tags: djangofromimportaddcontribrulesclassdefaults
2条回答

在代码中,传统的alter table语句不能处理空间字段,它试图创建一个“None”列,然后使用AddGeometryColumn命令正确地创建它。但是,South似乎没有得到提示,因此,AddGeometryColumn失败,因为列已经存在。在

仍在努力寻找答案,但我希望它只是升级到更新的版本。我会通知你的!在

Django source

你试图重写一个现有的模型字段,在我看来,你必须对基类进行monkey-patch才能使其生效。在

像这样的东西应该能起作用

from django.contrib.gis.db.models import Address

class CustomPointField(geomodels.PointField):
    def formfield(self, **kwargs):
        defaults = {
            'form_class': CustomFormField
        }
        defaults.update(kwargs)
        return super(PointField, self).formfield(**defaults)

Address.add_to_class('geoposition', CustomPointField())

我不确定south是否会接受这个,所以您可能需要一个新的syncdb或手动更改。在

相关问题 更多 >