2013-02-16 73 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