Django:自定义默认管理器,具有针对所有视图/界面(自定义、管理、graphene、rest等)的基于用户的查询
在Django中,我试图实现某种“安全中间件”,它只允许在登录用户匹配的情况下访问某些db信息 到目前为止,我发现了两种方法:中间件或manager中的自定义函数(都在这里解释) 最干净的解决方案示例:自定义函数Django:自定义默认管理器,具有针对所有视图/界面(自定义、管理、graphene、rest等)的基于用户的查询,django,django-models,django-managers,Django,Django Models,Django Managers,在Django中,我试图实现某种“安全中间件”,它只允许在登录用户匹配的情况下访问某些db信息 到目前为止,我发现了两种方法:中间件或manager中的自定义函数(都在这里解释) 最干净的解决方案示例:自定义函数 class UserContactManager(models.Manager): 用户的def(自身、用户): 返回self.get\u query\u set().filter(创建者=用户) 类MyUser(models.Model): #管理者 对象=UserContactMa
class UserContactManager(models.Manager):
用户的def(自身、用户):
返回self.get\u query\u set().filter(创建者=用户)
类MyUser(models.Model):
#管理者
对象=UserContactManager()
#然后在视图中像这样使用它
data=MyUser.objects.for_user(request.user)
但是,只有在您能够控制调用此自定义函数的代码时,此解决方案才有效(此处:for_user()
)。
但是,如果您使用的是第三方应用程序,如Django REST、Graphene或AdminView,则它们无法配置要使用的特定查询函数
我的目标是:
从django.x导入当前用户
类UserBasedManager(models.Manager):
def get_queryset(自我):
return super().get_queryset().filter(author=current_user.name)
教材(models.Model):
title=models.CharField(最大长度=100)
作者=models.CharField(最大长度=50)
objects=UserBasedManager()#默认管理器。
现在,我可以像在所有扩展中一样正常使用模型Book
我知道这个解决方案会有一些缺点,这对我来说是可以的:
- 只能在用户可用时使用(例如,不支持直接脚本)
- 缺少处理no或匿名用户(将其保留以保持示例简短)
from threadlocals.threadlocals import get_current_user
class UserBasedManager(models.Manager):
def get_queryset(self):
current_user = get_current_user()
return super().get_queryset().filter(author=current_user.name)