2

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-South 移行:

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

アイデアが不足しており、これを修正する方法がわかりません。

ソフトウェア:

  • ジャンゴ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',
}

しかし、移行で問題なく動作するには、すべてが必要です。問題の原因は何ですか?

4

2 に答える 2

2

コードを掘り下げると、従来のテーブル変更ステートメントは空間フィールドでは機能せず、「なし」列を作成しようとし、実際にAddGeometryColumnコマンドを使用して適切に作成します。ただし、南はヒントを取得していないようでAddGeometryColumn、列が既に存在するため失敗します。

まだ答えを見つけようとしていますが、新しいバージョンにアップグレードするだけで解決できることを願っています. お知らせします!

Django ソース

于 2014-07-17T05:42:03.210 に答える
0

既存のモデルフィールドをオーバーライドしようとしています。これを機能させるには、基本クラスにモンキーパッチを適用する必要があります。

たとえば、このようなものでうまくいくはずです

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または手動の変更が必要になる場合があります。

于 2013-02-16T15:04:22.573 に答える