2009-10-29 8 views
7

カスタムマネージャを使用してデフォルトのユーザーモデルを拡張する方法を教えてください。ユーザーモデルのDjangoカスタムマネージャ

私のアプリには、組み込みのグループモデルを使用して定義される多くのユーザータイプがあります。したがって、ユーザーはクライアント、スタッフなどである可能性があります。

User.clients.filter(name='Test') 

名前がTestのすべてのクライアントを取得するには、次のようなことができることが理想的です。私は、ユーザ定義モデルのカスタムマネージャを使ってこれを行う方法を知っていますが、少なくとも、djangoのソースコードを変更するのには不十分ですが、すべての焼き込み済みのものを保持しながら、Userモデルに移行する方法はわかりません自身ノーノーですいる....

答えて

-1

あなたはユーザープロファイルモデルが が定義されており、中に指定されているこの

AUTH_PROFILE_MODULE = 「accounts.UserProfile」

のユーザープロファイルをすることができますこの方法では、 各ユーザーオブジェクトにはメソッドがあります。 get_profile ) - そのユーザーに関連付けられたユーザープロファイルモデル のインスタンスを返します。

または、独自のauthenticate backendを書くことができます。これを設定に追加しました

+1

-1ユーザープロファイルは余分なデータ属性を追加するのに適していますが、この場合はまったく役に立ちません。そして最後のコードブロックは単純に壊れています(テストしましたか?)、そのようなクラスにマネージャーを追加することはできません。正しく設定されるようにadd_to_classメソッドを呼び出さなければなりません。 –

+0

Userの代わりにプロファイルモジュールを使用するのに役立ちます。 UserProfile.user_clients.filter(name = 'Test') しかし、私の最後のブロックは本当に壊れています。ありがとう。私は自分の答えを編集しています。 – Oduvan

16

はい、カスタムマネージャを直接Userクラスに追加できます。これはMonkeypatchingであり、コードのメンテナンス性が低下します(コードを理解しようとしている人が、Userクラスがそのカスタムマネージャをどこで取得したのか、探し出す場所が分からないことがあります)。この場合、ユーザークラスの既存の動作を実際にオーバーライドしていないので、新しいものを追加するだけで、比較的無害です。

from django.contrib.auth.models import User 
User.add_to_class('clients', ClientsManager()) 

あなたはジャンゴ1.1+を使用している場合は、proxy modelとサブクラスユーザーもできました。データベースには影響しませんが、monkeypatchなしで余分なマネージャーを追加することができます。

+0

おかげさまで、ありがとうございます。 –

+2

@JoseJoseこの回答を正しいとマークしてください – sberder

+0

非常に寛容な、ありがとう – nemesisdesign

関連する問題