2016-11-15 4 views
0

В моих Джанго - приложение разрешений настройки я для различных facilities со следующими группами:Джанго - реляционная ограничение (ограничение по группам пользователей)

ADMIN_<facility> 
USER_<facility> 

Где администратор имеет все права, которые пользователь имеет и некоторые другие.

Я хотел бы ограничить, чтобы пользователь, имеющий группу 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 я думаю.

Смежные вопросы