我有两个模型:
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),但仍然保留更改单个联系人权限的选项?(不是为了排除,仅在用户没有整个组的权限时才授予查看单个联系人的权限)
发布于 2014-05-19 21:53:47
抱歉,django-guardian不支持这样的行为。至于has_perm,由于我们需要对表中的每一行执行>=1查询,因此将它用于查询集的效率将非常低。
但是,您可以先为ContactGroup执行get_objects_for_user,然后为Contact执行,并使用第一个查询的结果扩展最后一个查询集。类似于:
contact_groups = get_objects_for_user(user, 'appname.view_group_contacts', ContactGroup)
contacts = get_objects_for_user(user, 'appname.view_contact', Contact)合并这些仍然存在问题,但这是可能的。
发布于 2014-05-20 20:05:30
非常难看的解决方法,它不考虑单个对象中的更改(如果remove=为False,则将所有权限重置为ContactGroup权限)。但如果需要,可以重写它以保留更改。我计划将它附加到“与组同步权限”按钮,这样它将只在用户请求时触发。Main pro与get_objects_for_user的合作符合预期。
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)https://stackoverflow.com/questions/23734455
复制相似问题