2011-01-11 4 views
2

私は現在、すべてのオブジェクトの上に本当に不器用なループをやっているが、それは遅い取得する予定です。djangoガーディアンで特定の権限を持つすべてのオブジェクトを取得するにはどうすればよいですか?

videos = Video.objects.all() 
video_list = [] 
for video in videos: 
    checker = ObjectPermissionChecker(request.user) 
    if checker.has_perm('view_video', video): 
     video_list.append(video) 

私はちょうどこのユーザーが権限を持っているすべてのオブジェクトを取得する方法がなければならない把握。

答えて

7

数日前に、新しいショートカット機能「get_objects_for_user」が更新されました。旧バージョンのガーディアンを使用していて更新できない場合は、そこからコードをコピーするだけです。

from guardian.shortcuts import get_objects_for_user 
... 
videos = get_objects_for_user(request.user, "view_video", Video.objects.all()) 

常に3つのクエリを実行します。 "use_groups"パラメータをFalseに指定すると、2つのクエリが実行されますが、返されたクエリーセットには、ユーザのグループに権限があるオブジェクトは含まれません。また、必要に応じて単一の許可ではなく、コードネームのリストを指定することもできます。 Read more here

+0

これは完璧です。ありがとうございました。 easy_install django-guardianでアップデートできますか? – willcritchlow

+0

心配はいりません - pip install --upgradeを使って正常に動作したようです。 – willcritchlow

+0

...そしてquery_setを返します。甘い!ありがとう! –

1

各ループに新しいインスタンスObjectPermissionCheckerを作成している間に、それを行う必要はありませんが、私はより構文的に砂糖になる可能性がありますあなたの質問のために

checker = ObjectPermissionChecker(request.user) 

videos = Video.objects.all() 

video_list = [video for video in videos if checker.has_perm('view_video', video)] 

あなたが使用する方法についての詳細はdjango-object-permissionshereを使用することができます。

1

あなたはいないジュースはこれはあなたのユーザーが両方を介しする権限を持つすべてのユーザーオブジェクトを取得する必要があります

content_type = ContentType.objects.get_for_model(Video) 
perm = Permissions.objects.get(codename='view_video'.split('.')[-1]) 

objs = set(
    UserObjectPermissions.objects.filter(user=user, permission=perm, content_type=content_type) 
) 

# and if you want to include groups 
objs.update(
    set(
     GroupObjectPermissions.objects.filter(group__user=user, permission=perm, content_type=content_type) 
    ) 
) 

、あなたが興味を持っているオブジェクトのみを引っ張って、データベースを頼むなぜ大幅にスピードアップしたい場合ユーザーとグループ。

関連する問題