Frage

Ich entwickle einen Authentifizierungs-Backend mit objektbasierten Berechtigungen für meine django-app.I Verwendung generischer Beziehungen zwischen einem Objekt und einer Erlaubnis:

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)

Und ich will jetzt alle Objekte eines bestimmten Inhaltstyp erhalten, für die eine сertain Gruppe oder Benutzer eine сertain Berechtigung hat. Was ist der beste Weg, das zu tun? Soll ich das zweite Ende des Verhältnisses in den Modellen der App definieren? oder besser schreiben benutzerdefinierte SQL? Ich versuche, ein generisches Backend zu bauen, so dass ich es auf der App hängen nicht will, dass es verwendet. Vielen Dank!

War es hilfreich?

Lösung

Ich vermute, Sie suchen so etwas wie:

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]

Dies sollte alle Objekte erhalten, die die Erlaubnis von perm haben, und die Gruppe der group in die Variable objects.

Sie können dies umzusetzen in einen Custom Manager Klasse, aber auch:

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

, die Ihre Ansicht Code machen würde einfacher:

perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1)     # Again, for brevity.
objects = group.permissions.for(perm)    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top