我有一个拥有所有者字段的模型。
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 ...
管理员的所有示例都在其查询中使用常量值,并且我正在寻找更具动态性的内容。这件事有可能吗?
感谢
答案 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所述。