Джанго практика родовых отношений - PullRequest
2 голосов
/ 16 февраля 2010

Я разрабатываю сервер аутентификации с разрешениями на основе объектов для моего django-приложения. Я использую общие отношения между объектом и разрешением:

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)

А теперь я хочу получить все объекты определенного типа контента, для которых у группы или пользователя есть разрешение. Какой лучший способ сделать это? Должен ли я определить второй конец отношения в моделях приложения? или лучше написать кастомный sql? Я пытаюсь создать общий бэкэнд, поэтому я не хочу, чтобы он зависел от приложения, которое его использует. Спасибо!

1 Ответ

3 голосов
/ 16 февраля 2010

Я предполагаю, что вы ищете что-то вроде:

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