2011-11-08 6 views
4

私はカテゴリのモデルを持っています。これには、循環外部キーが含まれています。私はこのモデルからすべてのデータをダンプし、別のDBMSにロードするためにdjango-southを使ってデータの移行を作成しましたが、この循環依存性のために多くの問題を抱えています。djangoで円形の外部キーを使用して器具をロードするにはどうしたらいいですか?

これは、私が言及していたモデルである:

class Category(MPTTModel): 
    name = models.CharField(_('name'), max_length=50, unique=True) 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='categories') 
    description = models.TextField(_('description'), blank=True, null=True) 
    created_on = models.DateTimeField(auto_now_add = True, default=date.today()) 
    updated_on = models.DateTimeField(auto_now = True, default=date.today()) 

    def __unicode__(self): 
     return "%s" %(self.name) 

    class Meta: 
     verbose_name = _('category') 
     verbose_name_plural= _('categories') 

答えて

11

このおかげで、post私は解決策を見つけることができました。一時的に外部キーチェックを無効にすると、データをロードする際にこの問題が発生する可能性の最も高い解決策となります。 Djangoはこれを行う方法を提供していないので、生のSQLコードを実行する必要があります。 だから、私はジャンゴ・南でデータ移行を作成し、残りは以下のコードである:

class Migration(DataMigration): 

    def forwards(self, orm): 
     #~ Disable foreign key checks during fixture loading 
     from django.db import connections, DEFAULT_DB_ALIAS 
     connection = connections[DEFAULT_DB_ALIAS] 
     if 'mysql' in connection.settings_dict['ENGINE']: 
      cursor = connection.cursor() 
      cursor.execute('SET foreign_key_checks = 0') 

     #~ Load fixture 
     from django.core.management import call_command 
     call_command('loaddata', 'categories_fixture.json', verbosity=0) 

     #~ Enable foreign key checks after fixture loading 
     if 'mysql' in connection.settings_dict['ENGINE']: 
      cursor = connection.cursor() 
      cursor.execute('SET foreign_key_checks = 1') 
     connection.close() 
+1

この回答を承認済みとマークすることを忘れないでください。そうすれば、他の人があなたの問題が解決されたことを知ることができます。 –

3

迅速な答えは、あなたがロードしながら、外部キー制約を無効にする必要があるということです。

Djangoのためのパッチがあります

が、それはか、バージョンではないかもしれません使用している場合があります。

https://code.djangoproject.com/ticket/3615


また、使用し、SQL器具を使用しないでください:https://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-sql-data

これは、SQLで実行できるモデルのSQLファイルで何かできることです。欠点は、使用しているSQLに応じてデータベースに依存しなくなったことです。

+0

回答ありがとうございます、これは解決策のようですが、それはdjangoの最新バージョン(1.3.1.1)でのみ利用可能で、古いものを使用しています。 – Yasel

+0

@Yaselもう一つの方法(これまで考えていたはずのもの)は、フィクスチャの代わりにモデルSQLを使うことです。 –

+0

あなたは私にこれに関する詳細を教えてくれますか?私に教えてください?...ありがとう – Yasel

0

は、Djangoは、相互依存の備品をロードするだけで、同じファイル

// fixtures.json 
[ 
{ 
    "model": "A", 
    "pk": 1100, 
    "fields": { 
     "bfk": 1000, 
    } 
}, 
{ 
    "model": "B", 
    "pk": 1000, 
    "fields": { 
     "Afk": 1100 
    } 
} 
] 
にそれらを追加サポートして2016年に答えます
関連する問題