2

私は自分の django-app のオブジェクトベースのアクセス許可を持つ認証バックエンドを開発しています。オブジェクトとアクセス許可の間の一般的な関係を使用しています:

class GroupPermission(models.Model):
    content_t= models.ForeignKey(ContentType,related_name='g_content_t')
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_t', 'object_id')
    permission=models.ForeignKey(Permission)
    group = models.ForeignKey(Group)

そして今、特定のグループまたはユーザーが特定の権限を持っている、指定されたコンテンツ タイプのすべてのオブジェクトを取得したいと考えています。それを行う最善の方法は何ですか?アプリのモデルでリレーションの 2 番目の端を定義しますか? カスタムSQLを書いたほうがいいですか?私は汎用バックエンドを構築しようとしているので、それを使用しているアプリに依存したくありません。ありがとう!

4

1 に答える 1

3

次のようなものを探していると思います。

perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1)     # Again, for brevity.
group_perms = GroupPermission.objects.filter(permission=perm, group=group)
objects = [x.content_object for x in group_perms]

permこれにより、 のアクセス許可と のグループを持つすべてのオブジェクトがgroup変数 に取得されますobjects

これをCustom Managerクラスに実装することもできます。

class GroupPermissionManager(models.Manager):
    def for(self, perm):
        group_perms = GroupPermission.objects.filter(permission=perm, group=self)
        objects = [x.content_object for x in group_perms]

class Group(models.Model):
    name = models.CharField(max_length=30)
    permissions = GroupPermissionManager()

これにより、ビューコードがより簡単になります:

perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1)     # Again, for brevity.
objects = group.permissions.for(perm)    
于 2010-02-16T20:32:09.873 に答える