2013-02-16 72 views
2

我有GeoDjango内置自定义字段:GeoDjango内置以南导致 “重复的列名错误” 与SpatiaLight的分贝

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的南迁:

class Migration(SchemaMigration): 

    def forwards(self, orm): 
     # Adding field 'Address.geoposition' 
     db.add_column('company_address', 'geoposition', 
         self.gf('project.apps.appname.fields.PointField')(srid=900913, geography=True), 
         keep_default=False) 


    def backwards(self, orm): 
     # Deleting field 'Address.geoposition' 
     db.delete_column('company_address', 'geoposition') 

而当这种迁移我得到的错误:

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

我已经用完了我deas并且不知道如何解决这个问题。

软件:

  • 的Django 1.4
  • SpatiaLight的3.0.1
  • @中1.9.2
  • 南0.7.6

对于DB地理元数据被inited:

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', 
} 

但我需要一切工作正常与迁移。任何想法是什么导致这个问题?

回答

0

你试图覆盖现有的模型字段,你将不得不猴子补丁基类,使这项工作。

E.g.这样的事情应该伎俩

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()) 

我不知道如果南会选择这个,所以你可能需要一个新的syncdb或手动更改。

+0

不,我不是现有模型的首要领域。我在我的应用程序中有我自己的模型: class Company(models.Model):... geoposition = CustomPointField。这只是我在模型中使用的自定义字段。其他自定义字段没有问题。 – imposeren 2013-02-16 20:17:19

+0

我甚至尝试使用默认字段: psss = geomodels.PointField(geography = True,blank = True,default ='Point(0 0)',srid = 900913)。导致相同的错误 – imposeren 2013-02-16 20:22:27

2

挖掘代码时,传统的alter table语句不适用于空间字段,它会尝试创建一个“无”列,然后使用AddGeometryColumn命令实际创建它。然而,南似乎没有得到提示,因此,AddGeometryColumn失败,因为列已经在那里。

仍试图找到答案,但我希望它只是升级到更新的版本。我会及时向大家发布!

Django source

+1

我在Django问题跟踪器上发布了这个问题,因为它仍然存在于使用内置迁移系统的新版Django中:https://code.djangoproject.com/ticket/27072。 – 2016-08-16 23:49:05