Django - 关系约束(对用户组的约束)



在我的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上写类似的代码。

最新更新