2

認証アプリケーションからユーザーのプロファイルを定義するために使用されるプロファイル モデルがあります。また、ユーザーが作成されるたびに空のプロファイルを作成するシグナルがあります。

問題は、クリーンから開始すると、User テーブルの後に Profile テーブルが作成されるため、スーパー ユーザーを追加するように求められたときに、空のプロファイルを入力する Profile テーブルがないため、シグナル関数が失敗することです。

スーパーユーザーが追加されたときにプロファイルテーブルがすでに作成されているように、syncdbによってテーブルが作成される順序を強制する方法はありますか?

4

2 に答える 2

4

次のいずれかを実行します。

  1. この特定のエラー (テーブルが存在しない) をキャッチして無視するようにシグナルを変更します。スーパーユーザーのプロファイルも必要な場合は役に立ちません。

  2. DB スキーマ全体が初期化される前にデータを挿入しないでください。syncdb 中にスーパーユーザーを作成する必要はありません。これは後で開発コンソール ( ) から行うことができます。または、syncdb 中に自動的に読み込まれるアプリのフィクスチャdjango-admin.py shellにスーパーユーザーのユーザーとプロファイルを配置することもできます。initial_data.jsonこれにより、syncdb の情報がリセットされますが、場合によっては許容されます。

  3. AutoOneToOneFieldfrom lib を使用しdjango-annoyingて、初めてアクセスしたときに Profile を自動的に作成します。これは、私がこの問題を自分で解決する方法です。既存の機能をシグナルでやり直す必要はありません。彼らのウィキからの例を次に示します。

    from annoying.fields import AutoOneToOneField
    
    class MyProfile(models.Model):
        user = AutoOneToOneField(User, primary_key=True)
    
于 2011-05-23T21:28:26.710 に答える
1

テーブルが作成される順序は、INSTALLED_APPS にあるテーブルの順序によって異なります。

django.contrib.auth の上の Profile でアプリを移動してみてください

外部キー チェックのあるデータベースを使用している場合を除き、その場合、ユーザー テーブルを最初にする必要があります。

于 2011-05-23T21:04:48.113 に答える