Менеджер фильтрации для модели django, настроенный пользователем

У меня есть модель, что-то вроде этого:

class Action(models.Model): 
    def can_be_applied(self, user):
        #whatever
        return True

и я хочу переопределить его диспетчер по умолчанию. Но я не знаю, как передать текущую пользовательскую переменную менеджеру, поэтому мне нужно сделать что-то вроде этого:

 [act for act in Action.objects.all() if act.can_be_applied(current_user)]

Как мне избавиться от этого, просто переопределив менеджера?

Спасибо.


person Valentin Golev    schedule 08.03.2010    source источник


Ответы (2)


Поскольку менеджеры — это просто методы, вы можете передавать туда все, что хотите:

class ActionManager(models.Manager):
     def applied(self, user):
         return [x for x in self.get_query_set().all() if x.can_be_applied(user)]

Action.objects.applied(someuser)

Хоть и не очень эффективно, но работает.

person Dmitry Shevchenko    schedule 08.03.2010

Это очень похоже на то, что уже реализовано в django.contrib.auth: http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.get_all_permissions

Может быть, вы можете взглянуть на то, как они реализовали эту функцию?

person Olivier Verdier    schedule 08.03.2010