Question

Je développe un backend d'authentification avec des autorisations à base d'objets pour mon django-App.I utiliser les relations génériques entre un objet et une autorisation:

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)

Et maintenant, je veux tous les objets d'un type de contenu spécifié pour lequel un groupe сertain ou l'utilisateur dispose d'une autorisation de сertain. Quelle est la meilleure façon de le faire? Dois-je définir la seconde extrémité de la relation dans les modèles de l'application? ou mieux écrire sql personnalisé? Je suis en train de construire un backend générique, donc je ne veux pas dépendre de l'application qui l'utilise. Merci!

Était-ce utile?

La solution

Je devine que vous cherchez quelque chose comme:

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]

Cela devrait obtenir tous les objets qui ont l'autorisation de perm, et le Groupe de group dans la objects variable.

Vous pouvez implémenter cela dans un Custom Manager de classe, ainsi:

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()

Ce qui pourrait rendre votre code plus simple vue:

perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1)     # Again, for brevity.
objects = group.permissions.for(perm)    
scroll top