2011-08-17 11 views
0

私はDjangoをかなり新しくしています。設計していないサイトに機能を追加したりメンテナンスしているだけなので、構造について混乱しています。プロジェクト。このサイトでは、データベースの移行にSouthを使用しています。新しいアプリケーションをプロジェクトに追加するには、これを使用しています。私が今問題を抱えているのは、モデルの特定のフィールドを削除する必要があるということです。これは、もはや必要ではなく、管理ページに記入する必要があるからです。これまでの私のDjangoの理解から、カスタムフィールドのようです。これは、独自の別のライブラリアプリケーションでこのように定義されています(まだ正しいかどうかは分かりません)。カスタムフィールドを使用したカスタムサウスマイグレーション

class Genre(models.Model): 
    name = models.CharField(max_length=255) 
    def __unicode__(self): 
     return u"%s" % self.name 

ここでは、カスタムフィールドを使用するモデルがあります。

class Entry(models.Model): 
    artist = d51fields.ForeignKey(Artist, instantiate_fn=instant_artist) 
    album = d51fields.ForeignKey(Album, js_methods=['match_artist_and_startswith'], instantiate_fn=instant_album) 
    track = d51fields.ForeignKey(Track, js_methods=['match_album_and_startswith'], instantiate_fn=instant_track) 
    genre = models.ForeignKey(Genre) 
    submitted = models.DateTimeField(auto_now_add=True) 
    is_rotation = models.BooleanField() 
    dj = models.ForeignKey(DJ) 
    show = models.ForeignKey(Show, null=True, blank=True) 
    objects = EntryManager() 
    def __unicode__(self): 
     return "%s [%s]" % (self.artist, self.track) 
    class Meta: 
     verbose_name = "entry" 
     verbose_name_plural = "entries" 

私は、カスタムフィールドを移行するためのマニュアルを見てきましたが、それはすべて本当に私のために混乱しているので、私はいくつかのより多くの助けを探しています。私はちょうどジャンルフィールドを保持しているテーブルを取り除き、関連する外部キーの依存関係を取り除きたいと思う。私はSouthのカスタムルールを書いて、移行を使用するか、PostgreSQLで手作業で試してみるべきだと思いますか?私はちょうどPostgresとそれをやってみたと私は惨めに失敗した。

ご指摘いただければ幸いです。あなたが状況についてのより多くの情報がほしいと思ったらちょうど尋ねなさい、そして私はポストにそれを加えることができる。私は対処しなければならない多くの依存関係があると感じていますが、うまくいけば簡単な修正があります。

また、データベース構造の見栄えを良くする方法を知っている人もいます。

ありがとうございます。みなさん皆素晴らしいです。

EDIT1

私はのForeignKeyを取り除いた後、私は次の取るべき行動がどんなものなのか全くわからない

manage.py schemamigration logs --auto 

! Cannot freeze field 'logs.entry.artist' 
! (this field has class d51_admin_autofk.fields.ForeignKey) 
! Cannot freeze field 'logs.entry.album' 
! (this field has class d51_admin_autofk.fields.ForeignKey) 
! Cannot freeze field 'logs.entry.track' 
! (this field has class d51_admin_autofk.fields.ForeignKey) 

! South cannot introspect some fields; this is probably because they are custom 
! fields. If they worked in 0.6 or below, this is because we have removed the 
! models parser (it often broke things). 

を実行したときに、私が得たものをここで

。私は南のドキュメントを調べましたが、このようなものを移行するためのルールを書く方法についてはあまり明確ではありませんでした。

答えて

1

投稿したコードのどこにでもカスタムフィールドは表示されません。私が見ているのは、Djangoに同梱されている標準フィールドをすべて含む2つのモデルです。

私が正しく理解している場合は、Genreモデルへの参照をすべて削除することができます。ForeignKeyその後、./manage.py schemamigration <yourappname> --autoを実行します。これにより、Entryモデルのgenreフィールドのデフォルト値が尋ねられ、何らかのIDが提供されます。これは、マイグレーションが順方向と逆方向の両方に適用できるため、マイグレーションを元に戻そうとすると、これはすべてのモデルインスタンスに挿入される値です)。

最後に、マイグレーションを適用するだけで起こる:./manage.py migrate <yourappname>

その後、Genreモデルを格納しているテーブルを削除しても安全です。

開発サーバーでこれを試してください。ただし、それが爆発しないことを確認してください。 ( - ;

+0

あなたが言ったことを試してみましたが、カスタムフィールドがフリーズできないというエラーが出ました。投稿を編集して出力を表示しました。 – thebeagle

+0

ああ、申し訳ありませんが、あなたのコードをもう一度見て、実際にカスタムフィールドがあるようです。さて、サウスフィールドにカスタムフィールドの処理方法を伝える方法はあると知っていますが、それについてのドキュメントを読む必要があります。あなたのケースでは、それを自明にする、例えば、南にそれらのフィールドを無視させるのは大丈夫です(彼らに何も変更を加えていないので)。 http://south.aeracode.org/docs/tutorial/part4.html – koniiiik

+0

ありがとうございます。私は最終的にそれを把握することができました。乾杯。 – thebeagle

関連する問題