0

と呼ばれるユーザーへの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.userLogger

すべてがうまく機能しているように見えました。次に、アプリケーションに新しいユーザーとして登録し、パスワードを設定して認証した後、最近登録したユーザーとしてこのコードをトリガーしました。このActivityEntryItemケースで発生したオブジェクトは、コードがトリガーされたときにログインしていたユーザーではなく、以前にログインしていたユーザーを指しています。

このプロセスを繰り返すたびに (つまり、新しいユーザーを招待し、招待されたユーザーとして登録し、コードをトリガーします)、新しく作成された ActivityLogEntry によって参照されるユーザーは、実際にログインしたユーザーではなく、最後にログインしたユーザーを指します。の。

SimpleLazyObjectこれは、評価される前の request.user と関係があるのではないかと思いました。それで、私は変更したので、 after__init__を呼び出します。これで問題は解決したようです。サーバーを再起動すると、この問題が解消されることにも気付きました。self.user.pkself.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)
4

0 に答える 0