В приложении, которое мы разрабатываем с использованием Django, в некоторых случаях нам нужно автоматически назначать разрешения пользователям для некоторых моделей, у которых есть владельцы (правила для имени поля не существует, это могут быть «пользователь», «владелец»), "тренер" и т. д., также может быть более чем одним полем.) Мое решение состоит в том, чтобы создать декоратор, содержащий имена этих полей, которые будут помещены перед определением модели, например, так (без использования специфического для django кода в примерах):
@auto_assign_perms('owner', 'user')
class Test(Base):
pass
Предположим, что Base
- это абстрактный класс, производный от класса Model
Джанго, где я добавляю функциональность для назначения разрешений после сохранения объекта.На данный момент я печатаю только список пользователей, назначенных для класса.Ниже вы можете найти код для декоратора и Base
класса:
class auto_assign_perms(object):
def __init__(self, *users):
self.users = users
def __call__(self, cls):
cls.owners.update(self.users)
return cls
class Base(object):
owners = set()
def save(self, *args, **kwargs):
for owner in self.owners:
print owner,
print
И мои модели могут выглядеть так:
@auto_assign_perms('owner', 'user')
class Test(Base):
pass
@auto_assign_perms('coach')
class Test2(Base):
pass
Проблема в том, что оба дочерних класса содержат все триполя ('owner', 'user', 'coach')
, хотя print self.__class__.__name__
в методе Base.save()
правильно отображают «Test» или «Test2».Я пытался добавить classmethod get_owners()
в Base
class, а затем перебирать его результаты, но это не помогает.Как я могу решить это?Может быть, я должен использовать метаклассы (я их пока не получаю)?Заранее спасибо.