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。
我有一个具有所有者字段的模型。
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。