2016-04-27 23 views
0

特定の権限に関連するクエリセットに追加のフィールドを追加したいのですが、CASE内で "has_perm"を使用することは可能ですか?DjangoのCASEクエリーセット内で "has_perm"を使用することは可能ですか?

var_group = Group.objects.all().annotate(mypermission=Case(
When(self.has_perm('app.mypermission'), then=Value(True)), 
default=Value(False), 
output_field=BooleanField(), 
)) 

エラーは次のとおりです。

グローバル名 '自己' の

答えて

1

selfが定義されていないが定義されていません。 annotateで使用したselfは、Groupオブジェクトではありません。クエリセットはSQLクエリを作成するためのものです。 has_permはクエリ構築の一部ではありません。オブジェクト方法はGroupです。

したがって、答えは「はい」です。

var_group = Group.objects.all().annotate(mypermission=Case(
When(permissions__codename='app.permission', then=Value(True)), 
default=Value(False), 
output_field=BooleanField(), 
)) 

解決策があります。私はすべてのGroupオブジェクトを照会し、それを1つずつ反復して注釈を付けることを提案します。

var_group = Group.objects.all() 

for group in var_group: 
    if group.permissions.filter(codename='app.permission').exists(): 
     group.mypermission = True 
    else: 
     group.mypermission = False 
+0

これは良い考えです。私は、グループに "has_perm"というメソッドがないことに気がつきました。これはUser ** 'Group'オブジェクトにのみ関連しています。 'has_perm' **属性はありません。グループにその方法を使用する考えはありますか? – Steve

+0

ああ、あなたはDjango Groupのモデルhttps://docs.djangoproject.com/es/1.9/ref/contrib/auth/#group-modelを使いました。 'has_perm'メソッドはありません。私は答えを更新します。 –

+0

2番目のオプションは完璧です:ちょうど(codename = 'app.permission')が動作せず、私は(codename = 'permission')使用しました – Steve

関連する問題