在我的django - app中,我为不同的facilities
设置了以下组的权限:
ADMIN_<facility>
USER_<facility>
admin拥有user的所有权限,甚至更多。
我想约束具有组ADMIN_facility1
的用户永远不会添加到组USER_facility1
。我的方法:
class MyUser(models.Model):
...
@property
def admin_facilities(self):
[g.name for g in self.groups.filter(name__startswith="ADMIN_")]
@property
def user_facilities(self):
[g.name for g in self.groups.filter(name__startswith="USER_")]
def save(self, **kwargs):
for user_fac in self.user_facilities:
if user_fac in self.admin_facilities:
# remove the user facility
self.groups.remove(
self.groups.get(name="USER_{}".format(user_fac)
)
super(MyUser, self).save(**kwargs)
...
这种方法不起作用,因为在调用save函数时组还没有存在。
问题:如何约束在ADMIN_<facility>
组中的用户永远不能添加到相应的USER_<facility>
组?
您可以将保存调用发送到开头,如下所示:
def save(self, **kwargs):
super(MyUser, self).save(**kwargs)
for user_fac in self.user_facilities:
if user_fac in self.admin_facilities:
# remove the user facility
self.groups.remove(
self.groups.get(name="USER_{}".format(user_fac)
)
M2M field
的保存顺序完全不同
在填充M2M数据之前必须保存用户实例(考虑数据库)。我认为你需要的是m2m_changed信号。
我想在post_add
上写类似的代码。