1

djangoを既存のアプリケーションと一緒に実行し、データベースを共有しています。そして、既存の「ユーザー」テーブル(Django自身のものではない)を使用してユーザー情報を格納したいと思います。

User定義のMetaクラスで、Djangoが使用するテーブルの名前を変更できるようです。

ただし、Djangoコア自体は変更しない方がよいでしょう。

したがって、コアauth.Userクラスを次のようにサブクラス化できると考えていました。

class OurUser(User) :
    objects = UserManager()
    class Meta:
        db_table = u'our_user_table'

ここでの目的は、カスタマイズされたUserクラスにフィールドを追加することではありません。ただし、代替テーブルを使用するだけです。

ただし、これは失敗します(ORMは、our_user_tableに元のUserテーブルを参照する外部キーが必要であると想定しているためと思われますが、そうではありません)。

それで、私たちがやりたいことをするためのこの賢明な方法はありますか?クラスをテーブルにマップする簡単な方法を見逃したことがありますか?または、そうでない場合、これを機能させることができますか?

アップデート :

local_settings.pyのUserの_metaに「モンキーパッチ」を適用するだけで、必要な変更を加えることができると思います。

User._meta.db_table = 'our_user_table'

私がこれをした場合に起こり得る何か悪いことを誰かが考えることができますか?(特に、かなり典型的なDjango / Pinaxアプリケーションのコンテキストでは?)

4

1 に答える 1

6

古いテーブルを代替の認証ソースとして設定し、これらすべての問題を回避すると便利な場合があります。

もう1つのオプションは、ユーザーをサブクラス化し、サブクラスがユーザーモデルを指すようにすることです。保存機能をオーバーライドして、古い機能を保持するために必要なすべてのものが確実に存在するようにします。

私はこれらのどちらも自分でやったことはありませんが、うまくいけば、それらは有用なポインタです。

更新 この場合の代替認証とは、「はい、これは有効なユーザー名/パスワードです」という小さなPythonスクリプトです。次に、標準のDjangoテーブルにモデルのインスタンスを作成し、レガシーテーブルからフィールドをコピーします。新しいユーザーを呼び出し元に返します。

2つのテーブルの同期を維持する必要がある場合は、代替認証で標準のdjangoユーザーを作成せず、「はい、これは有効なパスワードとユーザー名です」と言うだけで済みます。

于 2009-05-14T23:50:16.950 に答える