次の方法があります:
def _attempt(actor):
if actor.__class__ != User:
raise TypeError
これはビューから呼び出されます:
self.object.attempt(self.request.user)
ご覧のとおり、_attempt メソッドは actor が 型 であると想定していますdjango.contrib.auth.models.User
が、オブジェクトは 型のようです。なぜそうなるのでしょうか。そして、もっと重要なのは、 (明らかに User オブジェクトの一種のラッパー)をオブジェクトにdjango.utils.functional.SimpleLazyObject
変換するにはどうすればよいかということです。LazyObject
User
詳細はRequest.user
以下をご覧ください:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.userこのドキュメントでは、 はオブジェクトrequest.user
である必要があることを示しているようですUser
...
======後編集=====
現在、次の方法があります:
def _attempt(obj, action, actor, msg):
actor.is_authenticated()
if isinstance(actor, LazyObject):
print type(actor)
ユーザーを渡していますが、if
条件は依然として true であり、アクターは依然として ですLazyObject
。なぜそうなるのでしょうか?
ベストアンサー1
Django は遅延ロードを行うため、認証状態に応じてまたは のrequest.user
いずれかになります。属性がアクセスされたときにのみ「起動」し、適切なクラスを返します。残念ながら、はプリミティブ クラス属性であるためカウントされません。これが実際に型であることを知る必要がある場合があり、そのためまたはにプロキシするのは間違いです。User
AnonymousUser
__class__
SimpleLazyObject
User
AnonymousUser
簡単に言えば、あなたが持っているような比較は単純に不可能です。しかし、あなたは本当にここで何を達成しようとしていますか?たとえば、または であるかどうかを確認しようとしている場合はUser
、そのためのAnonymousUser
があります。request.user.is_authenticated()
ただし、一般的なルールとして、ダックタイピングを乱用すべきではありません。パラメータは、特定の型またはサブタイプ(User
またはUserSubClass
)であるべきです。持っているそうしないと、混乱を招き、脆弱なコードになってしまいます。