【问题标题】:Why does filtering a QuerySet behave differently for user vs. superuser?为什么过滤 QuerySet 对用户和超级用户的行为不同?
【发布时间】:2015-07-12 18:48:49
【问题描述】:

当以我的超级用户“admin”身份登录时,我可以按任何字段过滤 QuerySet。但是,当我以普通用户身份登录时,我只能按“用户”字段进行过滤。尝试按任何其他字段进行过滤会返回一个空列表。

class Question(models.Model):

    user = models.ForeignKey(User, default=1)
    verb = models.ForeignKey(Verb)
    voice = models.ForeignKey(Voice)
    ...

这很好用:

def next_question(request):
    user = request.user
    q = Question.objects.filter(user=user)

当以超级用户身份登录但以普通用户身份登录失败时,这可以正常工作(myverb 是我的Verb 模型的一个实例):

def next_question(request):
    user = request.user
    q = Question.objects.filter(user=user, verb=myverb)

我是 Django 新手(虽然不是 Python),所以我是否缺少一些需要为普通用户设置的权限来解决此问题?

已编辑以添加显示数据库中项目的图像

超级用户“管理员”的示例问题:

用户“jamie”的示例问题:

【问题讨论】:

    标签: python django


    【解决方案1】:

    在这个 ORM 查询中,超级用户和普通用户没有区别。

    您根本没有任何具有myverb 动词字段和request.user 用户字段的Question 实例。

    【讨论】:

      【解决方案2】:

      没有区别。超级用户也是普通用户。

      取决于当时用户变量的值设置为什么(我假设它是当前登录的用户)您可以将您的查询解释为:相关用户是当前登录用户的所有问题。

      因此,如果您以其他人身份登录时没有看到任何结果,那是因为您确实没有任何与您相关的问题。

      如果您确定应该有结果,则可能是您的用户变量未设置为您认为的那样。确保它的值是正确的。

      即用户=request.user

      【讨论】:

      • 我检查了用户变量,'jamie' 是<SimpleLazyObject: <User: jamie>>,而'admin' 是<SimpleLazyObject: <User: admin>>。另请参阅对显示对象确实存在于数据库中的问题的编辑。
      • 它应该可以工作。一定是别的东西。你如何决定它是否有效。
      • 我明白了。我在创建新用户时从“管理员”帐户复制所有问题,更改 user 字段但不更改 verb 字段或其他字段。这意味着我正在比较两个不同的 Verb 对象,因此没有返回任何结果。
      • 太棒了!如果您不使用它,请尝试使用 pudb,它很棒。并签出 django 调试工具栏
      • 我主要在 PyDev 中运行/调试,但目前我一直在添加断言语句并检查 Chrome 中的调试日志。将检查 pudb 和工具栏。
      猜你喜欢
      • 2022-01-19
      • 2013-05-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2018-12-23
      • 2012-06-01
      相关资源
      最近更新 更多