django模型的过滤管理器,由用户定制

时间:2010-03-08 08:50:23

标签: django django-models django-managers

我有一个模特,像这样:

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

如何通过覆盖经理来摆脱它?

感谢。

2 个答案:

答案 0 :(得分: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)

虽然效率不高,但却可以胜任。

答案 1 :(得分:0)

这看起来很像django.contrib.authhttp://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.get_all_permissions

中已实施的内容

也许你可以看看他们是如何实现这个功能的?