2016-11-15 47 views
0

在我的Django - 应用程序,我设置的权限不同facilities有以下几组:Django的 - 关系约束(用户团体的约束)

ADMIN_<facility> 
USER_<facility> 

其中Admin拥有所有该用户拥有多一些的权利。

我想约束一个拥有组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) 
... 

此方法不起作用,因为在调用保存功能期间组尚未存在。

问题:我该如何限制一个ADMIN_<facility>组中的用户永远不能被添加到相应的USER_<facility>组?

回答

0

您可以发送保存来电开始,像这样:

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) 
      ) 
0

M2M field有完全不同的秩序得到保存。

在填充M2M数据之前必须保存用户实例(考虑数据库)。 我觉得你需要的是m2m_changed信号。

并写在post_add我认为类似的代码。