2016-11-15 65 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我認爲類似的代碼。