django - 动态管理器

django - dynamic manager


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

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

我扩展了 django User class 并添加了所有权文件

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

我想为 MyModel 创建一个管理器,这样它将只检索与当前登录用户的所有权对应的对象。
例如(使用 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 ...

经理的所有示例都在他们的查询中使用常量值,而我正在寻找更动态的东西。这件事甚至可能吗?
谢谢

自定义管理器无法做到这一点,因为模型管理器是在 class 加载时实例化的。因此,它在 http-request-response 周期方面是无状态的,并且只能提供一些您无论如何都必须将用户传递给的自定义方法。那么你为什么不在你的模型上添加一些便利 method/property(经理似乎不需要这个唯一的目的)

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. Another interesting solution is a custom middleware that makes the current user available via some function/module attribute which can be accessed in acustom manager's get_queryset() method, as described here