我有一个带有布尔字段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,针对该类提出了针对基于类的视图的解决方案,但我的视图是基于函数的。
非常感谢!
def your_view(request):
if request.method == 'GET':
qs = YourModel.objects.filter(user=request.user)