首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-guardian如何让对象继承相关对象的权限?

django-guardian如何让对象继承相关对象的权限?
EN

Stack Overflow用户
提问于 2014-05-19 17:40:38
回答 2查看 1.4K关注 0票数 5

我有两个模型:

代码语言:javascript
复制
class ContactGroup(models.Model):
    name = models.CharField(max_length=40)
    class Meta:
        permissions=(('view_group_contacts', 'View contacts from group'))


class Contact(models.Model):
    name = models.CharField(max_length=40)
    group = models.ForeignKey(ContactGroup)
    class Meta:
        permissions=(('view_contact', 'View contact'))        

我如何让django guardian考虑ContactGroup权限,例如我正在做`get_objects_for_user( user,'appname.view_contact),但仍然保留更改单个联系人权限的选项?(不是为了排除,仅在用户没有整个组的权限时才授予查看单个联系人的权限)

EN

回答 2

Stack Overflow用户

发布于 2014-05-19 21:53:47

抱歉,django-guardian不支持这样的行为。至于has_perm,由于我们需要对表中的每一行执行>=1查询,因此将它用于查询集的效率将非常低。

但是,您可以先为ContactGroup执行get_objects_for_user,然后为Contact执行,并使用第一个查询的结果扩展最后一个查询集。类似于:

代码语言:javascript
复制
contact_groups = get_objects_for_user(user, 'appname.view_group_contacts', ContactGroup)
contacts = get_objects_for_user(user, 'appname.view_contact', Contact)

合并这些仍然存在问题,但这是可能的。

票数 1
EN

Stack Overflow用户

发布于 2014-05-20 20:05:30

非常难看的解决方法,它不考虑单个对象中的更改(如果remove=为False,则将所有权限重置为ContactGroup权限)。但如果需要,可以重写它以保留更改。我计划将它附加到“与组同步权限”按钮,这样它将只在用户请求时触发。Main pro与get_objects_for_user的合作符合预期。

代码语言:javascript
复制
def syncPerms(source, remove=False):
if not isinstance(source, ContactGroup):
    return False

contacts= source.client_set.all()
user_perms=get_users_with_perms(source, attach_perms=True)
for contact in contacts:
    for user, perm in user_perms.iteritems():
        if u'view_group_contacts' in perm:
            assign_perm('view_contact', user,client)
        else:
            if remove:
                remove_perm('view_contact', user, client)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23734455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档