根据某些用户信息过滤query_set的最安全,最干燥的方法

问题描述 投票:0回答:1

我有一个带有布尔字段is_draft的Post模型。如果用户已登录并且是工作人员,那么我想显示所有帖子;否则,仅is_draft为false的帖子。

我首先想到的是使用自定义模型管理器并按以下方式使用request.user:

class PostManager(models.Manager):
def get_queryset(self):
    if request.user and request.user.is_staff:
        return super().get_queryset()
    else:
        return super().get_queryset().filter(is_draft=False)

但是该请求在模型中不可用。

我看到有人在模型中使用middleware to access the user。在我看来,满足我的需求的最安全方法(即,在自定义管理器中完成了一次;修改views.py的人们不必打扰,也没有忘记它的风险),但是这种解决方案似乎引起了争议。

我当然可以在视图中添加一些逻辑,但是我觉得这不是DRY(因为我多次查询Post),也不安全(有风险有人忘记了它)。

根据您的说法,解决此需求的最干净,最安全的方法是什么?

PS:我发现了一个similar question,针对该类提出了针对基于类的视图的解决方案,但我的视图是基于函数的。

非常感谢!

django django-models django-middleware
1个回答
0
投票
def your_view(request):
    if request.method == 'GET':
        qs = YourModel.objects.filter(user=request.user)
© www.soinside.com 2019 - 2024. All rights reserved.