django - 动态经理

时间:2016-05-17 12:23:02

标签: python django django-models django-managers


我有一个拥有所有者字段的模型。

class MyModel(models.Model):
    owner = models.CharField(...)

我扩展了django User类并添加了所有权

class AppUser(User):
    ownership = models.CharField(...)

我想为MyModel创建一个Manager,因此它只会检索与当前登录用户的所有权相对应的对象。
例如(使用Django REST框架):

class MyModelAPI(APIView):
    def get(self, request, format=None):
        # This query will automatically add a filter of owner=request.user.ownership
        objs = MyModel.objects.all()
        # rest of code ...

管理员的所有示例都在其查询中使用常量值,并且我正在寻找更具动态性的内容。这件事有可能吗?
感谢

1 个答案:

答案 0 :(得分:0)

使用自定义管理器是不可能的,因为模型管理器在类加载时实例化。因此,它对于http请求 - 响应周期是无状态的,并且只能提供一些必须将用户传递给用户的自定义方法。那么为什么不在你的模型上添加一些方便的方法/属性(经理似乎没有必要为此唯一目的)

class MyModel(models.Model):
    ...
    @clsmethod
    def user_objects(cls, user):
        return cls.objects.filter(owner=user.ownership)

然后,在您看来:

objs = MyModel.user_objects(request.user)

对于基于经理的解决方案,请查看this question。另一个有趣的解决方案是一个自定义中间件,通过一些函数/模块属性使当前用户可用,可以在acustom manager的get_queryset()方法中访问,如here所述。