Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 根据某些用户信息筛选查询集的最安全、最干燥的方法_Django_Django Models_Django Middleware - Fatal编程技术网

Django 根据某些用户信息筛选查询集的最安全、最干燥的方法

Django 根据某些用户信息筛选查询集的最安全、最干燥的方法,django,django-models,django-middleware,Django,Django Models,Django Middleware,我有一个带有布尔字段的Post模型,is_draft。如果用户已登录并且是工作人员,则我希望显示所有帖子;否则,只有草稿为的帖子才是假的 我的第一个想法是使用自定义模型管理器并使用request.user,如下所示: class PostManager(models.Manager): def get_queryset(self): if request.user and request.user.is_staff: return super().get_queryset

我有一个带有布尔字段的Post模型,is_draft。如果用户已登录并且是工作人员,则我希望显示所有帖子;否则,只有草稿为的帖子才是假的

我的第一个想法是使用自定义模型管理器并使用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)
但是请求在模型中不可用

我看到一些人在模型中使用了a。在我看来,这似乎是满足我需求的最安全的方法(即在custom manager中完成一次;修改views.py的人不必费心,没有忘记它的风险),但这个解决方案似乎有争议

我当然有可能在视图中添加一些逻辑,但我觉得这既不枯燥(因为我多次查询帖子),也不安全(有人可能在某个时候忘记它)

根据你的说法,解决这一需求的最干净、最安全的方法是什么

PS:我发现了一个基于类的视图的解决方案,但我的视图是基于函数的


非常感谢

您可以使用管理器中的自定义函数进行筛选

class PostManager(models.Manager):

     def get_posts(self, user):
          if user.is_staff:
               return super().get_queryset()
          else:
               return super().get_queryset().filter(is_draft=False)
在您看来,使用以下方法获取查询集:

qs = Post.objects.get_posts(request.user)

在视图中过滤它们。您不能在models.py中过滤它们。除了在视图中过滤之外,我认为最好不要使用指示状态的布尔值,而是使用带有选项的状态字段。我的想法基本上是,一篇文章可以是草稿、发表、评论状态,而且很可能是排他性的。只是想一想…谢谢@MaharshiBingumalla!我的理解是,您的代码将向用户显示他创建的帖子。我试图做的是不同的:我希望一个不是工作人员的用户能够看到所有由任何用户创建的、不是草稿的帖子;对于工作人员,所有职位,包括草稿,由任何用户创建。你知道怎么解决这个问题吗?谢谢@吉比:我明白了。编辑了我的解决方案。检查一下。@Maharshi,它能用,谢谢!我在这个解决方案中看到的唯一问题是,对于任何用户,qs=Post.objects.all()仍然返回所有帖子,包括is_draft=True。我觉得有一种风险,在某个时刻,有人忘记使用get_posts(request.user)和use all()。但我想,除非我选择使用中间件解决方案,否则我需要承受这种风险。谢谢你的帮助!