我有两个型号:
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监护人在我做“get_objects_for_user(用户,' appname.view_contact)”时考虑ContactGroup权限,但仍然保留更改个人联系人权限的选项?(不排除,只有在用户不具有整个群组的权限时才允许查看单个联系人
答案 0 :(得分:1)
抱歉,django-guardian不支持此类行为。至于has_perm
- 将它用于查询集是非常低效的,因为我们需要对表中的每一行执行> = 1查询。
然而,您可以先为get_objects_for_user
执行ContactGroup
,然后为Contact
执行contact_groups = get_objects_for_user(user, 'appname.view_group_contacts', ContactGroup)
contacts = get_objects_for_user(user, 'appname.view_contact', Contact)
,并使用第一个查询集的结果扩展最后一个查询集。类似的东西:
{{1}}
合并这些问题仍然存在问题,但这是可能的。
答案 1 :(得分:0)
非常难看的解决方法,它不需要对单个对象进行帐户更改(如果remove = False,它会重置ContactGroup
权限的所有权限。但是如果需要,可以重写它以保留更改。我打算将它附加到“与组同步权限”按钮,因此只有在用户请求时才会触发它。主要职业是按照预期使用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)