10

auth_userdjangoのクラスにカスタムマネージャーを使用するにはどうすればよいですか?

私のdjangoプロジェクトでauth_userは、基本的なプロファイルクラスを使用しています。私のサイトのすべてのページで、いくつかのユーザーとプロファイルデータを使用しているため、すべてのユーザークエリがプロファイルに参加する必要があります。

select_relatedカスタムマネージャーのメソッドで使用したかったのget_query_set()ですが、それを定義したり、既存のをオーバーライドしたりする適切な方法が見つかりませんUserManager。何か案は?

注:ユーザーモデルを上書きしたくありません。または、より正確に言うと、私はすでに別のプロキシモデルでそれを上書きしました。このカスタムマネージャーをすべてのプロキシモデルで使用したいと思います。

4

2 に答える 2

8

さて、ようやく正解が見つかりました。最もクリーンな方法は、カスタム認証バックエンドを使用することです。

# in settings:
AUTHENTICATION_BACKENDS = ('accounts.backends.AuthenticationBackend',)


# in accounts/backends.py:
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User


class AuthenticationBackend(ModelBackend):
    def get_user(self, user_id):
        try:
            # This is where the magic happens
            return User.objects. \
                select_related('profile'). \
                get(pk=user_id)
        except User.DoesNotExist:
            return None
于 2013-06-13T13:27:00.923 に答える
4

これはかなり醜いですが、おそらくUserobjectsプロパティにモンキーパッチを適用できます。ミドルウェアの場合:

# manager.py
from django.contrib.auth.models import UserManager

class MyUserManager(UserManager):
    def get_query_set(self):
        qs = super(MyUserManager, self).get_query_set()
        return qs.select_related('profile')

# middleware.py
from django.contrib.auth.middleware import AuthenticationMiddleware
from managers import MyUserManager

class MyAuthMiddleware(AuthenticationMiddleware):
    def process_request(self, request):
        super(AuthenticationMiddleware, self).process_request(request)
        User.objects = MyUserManager()
        return None

次に、次の行を置き換えsettings.pyます。

MIDDLEWARE_CLASSES = (
    # ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # ...
)

に:

# settings.py
MIDDLEWARE_CLASSES = (
    # ...
    'yourapp.middleware.MyAuthMiddleware',
    # ...
)

注1:このコードは純粋に理論的なものであり、テストされたことがなく、テストする時間もありません。

注2:長期的なメンテナンスの観点から、このソリューションの使用はお勧めできません。

注3:誰かが何か他のことを提案した場合、あなたはおそらく私よりも彼または彼女に耳を傾けるべきです。

注4:おそらくより良いアイデアとして、完全に制御できるモデルクラスであるプロファイルをクエリしてみませんか?とにかく、いつでもプロファイルからユーザーオブジェクトを取得できるので、…</ p>

于 2011-06-29T13:14:12.337 に答える