代码之家  ›  专栏  ›  技术社区  ›  Valentin Golev

Django模型的过滤管理器,由用户自定义

  •  0
  • Valentin Golev  · 技术社区  · 14 年前

    我有一个模型,smth如下:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Dmitry Shevchenko    14 年前

    因为管理者只是一种方法,所以您可以在那里传递您想要的任何内容:

    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)
    

    虽然效率不是很高,但它确实起作用。

        2
  •  0
  •   Olivier Verdier    14 年前

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

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

    推荐文章