0

次のDjango manage.pyシェル セッションで、ユーザー オブジェクトに追加したアクセス許可が、そのユーザーに対して新しいクエリを実行するまで表示されないのはなぜですか?

In [16]: john = User.objects.create_user(username='john')

In [17]: john
Out[17]: <User: john>

In [18]: john.get_all_permissions()
Out[18]: set([])

In [19]: john.user_permissions.add(Permission.objects.get(codename='add_user'))

In [20]: john.get_all_permissions()
Out[20]: set([])   <== I expected to see the new permission here.  Why not?

In [21]: john = User.objects.get(username='john')

In [22]: john.get_all_permissions()
Out[22]: set([u'auth.add_user'])
4

1 に答える 1

0

Django は、特定のユーザー インスタンスに対して最初にパーミッションをリクエストしたときにパーミッションのキャッシュを_perm_cache行い、ユーザー オブジェクトに対してそれらを保存します。これは、リクエスト中に何度も発生する可能性があるパーミッションをチェックするときに過剰なデータベース ルックアップを防ぐためです (特にテンプレートのレンダリング中)。フォームやリンクに関する許可チェックが必要になる場合があります)。

データベースからユーザーをリロードするという、問題に対する 1 つの解決策を特定しました。もう1つは、ユーザーオブジェクトから削除することです_perm_cache_group_perm_cache徹底的にしたい場合):

del john._perm_cache
del john._group_perm_cache
于 2013-03-16T01:02:37.263 に答える