Django generische Beziehungen Praxis
-
21-09-2019 - |
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!
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)