4

私は最近、空き時間にいくつかの Web アプリケーションで Django の実験を始めました。1 つのデータ モデルを設計しているときに、継承を使用して Web サイトのユーザーを定義するか、フレームワークによって既に提供されている User クラスでモンキー パッチとして知られる手法を使用するかというジレンマに遭遇しました。

(に従って、すべてのモデルなどをエラーなしで定義した後)を使用してフィールドを追加しようとしましたpython manage.py validate

User.add_to_class('location', models.CharField(max_length=250,blank=True))

syncdbそしてコマンドを実行しました。ただし、このエラーが発生し続けます

OperationalError: そのような列はありません: auth_user.location

私がサイトの管理者ビューにいるのか、manage.py シェルにいるのか。私が見逃している余分なステップがあるに違いありませんが、サルのパッチ技術全体に関するドキュメントは限られているようです。ですから、相続に頼る前にあなたに助けを求めています。もちろん、追加のドキュメントへのコード、ヒント、またはポインタは大歓迎です。

前もって感謝します。

PS。私は、この手法が醜く、おそらく賢明でないことを認識しています。;)

4

5 に答える 5

13

両方のアプローチに代わる方法があり、関連するプロファイル モデルを使用するだけです。これは、十分に文書化された、強く推奨されるアプローチでもあります。おそらく、add_to_class アプローチが十分に文書化されていない理由は、 (正当な理由で)明示的に推奨されていないためです。

于 2009-09-09T13:55:48.210 に答える
7

モデルにフィールドを追加するときは、「公式」の方法で行ったとしても、データベースを移行する必要があります.Djangoはそれを行いません. テーブルをドロップして、./manage.py syncdb再度実行してください。

southこのようなことを管理してくれるなどの移行フレームワークの 1 つを調査することをお勧めします。

于 2009-09-09T13:52:26.647 に答える
2

モデルを拡張する(少し古い) 方法を次に示しUserます。

ドキュメントの説明は次のとおりです。

そして、これは、このトピックに関する django-users の最近の会話です。

于 2009-09-09T13:48:40.160 に答える
0

Djangos フレームワークは、メタクラスを使用してテーブルを初期化します。つまり、クラスを再初期化しない限り、新しい列にモンキー パッチを適用することはできません。(そうかも知れない)。

詳細については、変更されたクラスを返すことと type() を使用することの違いを参照してください。

于 2009-09-09T13:46:48.847 に答える
0

モンキーパッチがどこに定義されているかという問題に遭遇するかもしれません。django syncdb は「純粋な」認証アプリケーションからのみデータベース テーブルを作成すると思います。そのため、モデルには「場所」がなく、パッチのあるサイトはフィールドを探します。

ユーザー プロファイルに追加情報を追加するためのおそらくより簡単な方法は、Django docs に記載されています。

于 2009-09-09T13:47:22.983 に答える