と呼ばれるユーザーへのForeignKeyを持つモデルがありますActivityEntryItem
。と呼ばれるクラスLogger
は、これらのモデルを作成するための単純化されたインターフェースを提供します。からの抜粋を次に示しますLogger
。
def __init__(self, organization=None, user=None):
result = super(Logger,self).__init__()
if user:
self.user = user
if organization:
self.organization = organization
return result
def log(self, **kwargs):
# Snip for the sake of brevity
kwargs_subset['user'] = self.user
entry = ActivityLogEntry.objects.create(**kwargs_subset)
user
を使用してビューから__init__
asに渡されます。request.user
Logger
すべてがうまく機能しているように見えました。次に、アプリケーションに新しいユーザーとして登録し、パスワードを設定して認証した後、最近登録したユーザーとしてこのコードをトリガーしました。このActivityEntryItem
ケースで発生したオブジェクトは、コードがトリガーされたときにログインしていたユーザーではなく、以前にログインしていたユーザーを指しています。
このプロセスを繰り返すたびに (つまり、新しいユーザーを招待し、招待されたユーザーとして登録し、コードをトリガーします)、新しく作成された ActivityLogEntry によって参照されるユーザーは、実際にログインしたユーザーではなく、最後にログインしたユーザーを指します。の。
SimpleLazyObject
これは、評価される前の request.user と関係があるのではないかと思いました。それで、私は変更したので、 after__init__
を呼び出します。これで問題は解決したようです。サーバーを再起動すると、この問題が解消されることにも気付きました。self.user.pk
self.user = user
これは Django (1.4) のバグだと思われますが、まずここにチェックインして、なぜこれが起こっているのかについて何か考えがあるかどうかを確認したかったのです。ありがとう。
編集:この mixin は、ログを記録する必要があるビューで使用されます。これは、ロガーがどのようにインスタンス化され、最終的にどのようにログに記録されるかを示しています。
class LoggerMixin(object):
def dispatch(self, request, *args, **kwargs):
self.logger = Logger(user=request.user)
return super(LoggerMixin, self).dispatch(request, *args, **kwargs)