【问题标题】:MultipleObjectsReturned: get() returned more than one Permission -- it returned 2MultipleObjectsReturned: get() 返回了多个 Permission -- 它返回了 2
【发布时间】:2016-08-13 07:17:09
【问题描述】:

我的测试失败,说 get() 返回了 2 个权限。但我没有在任何地方分配 2 个权限。在我看来,我从 django.contrib.auth.mixins 继承 PermissionRequiredMixin 并分配权限。以下是我的测试设置代码,其中显示错误:

def setUp(self):
        self.material = MaterialFactory.create()
        self.material_reorder = MaterialFactory.create(
            opening_stock=500, reorder_qty=1000)
        self.user = User.objects.create_user(
            'admin', 'lennon@thebeatles.com', 'admin')
        self.user.user_permissions.add(
            Permission.objects.get(codename="add_material"))

【问题讨论】:

  • 错误:test_modal_create_view (stores.tests.test_views.ReelMaterialModalCreateViewTest) ------------------------------ ---------------------------------------------------- Traceback(最近一次调用最后):文件“ /home/anand/base/tests/mixin.py”,第 95 行,在 setUp Permission.objects.get(codename=self.permission_codename).id) 文件“/home/anand/Envs/local/lib/python2.7 /site-packages/django/db/models/manager.py”,第 122 行,在 manager_method 返回 getattr(self.get_queryset(), name)(*args, **kwargs) MultipleObjectsReturned: get() 返回多个权限-- 返回 2!
  • 使用edit 按钮更新您的问题。但错误很明显。您有两个具有相同代号的权限。在这种情况下,您预计会发生什么?
  • 我正在使用默认的 django 权限:在我的视图中就像这个 permission_required = 'stores.add_material'。权限不超过一个
  • 该错误表明有两个权限具有相同的代号。它与需要什么权限无关
  • 谢谢。我得到了它。是的,我有 2 个具有相同代号的权限

标签: django


【解决方案1】:

你分配了什么并不重要。此行导致错误 Permission.objects.get(codename="add_material") 表示您拥有多个权限,代号为add_material

要了解名称 add_material 的其他权限是什么,请进入 Django 控制台 python manage.py shell 在那里导入身份验证模型并检查权限

从 django.contrib.auth.models 导入 * 对于 Permission.objects.filter(codename="add_material") 中的 p 打印(p.pk,p.content_type)

这应该会告诉您哪些其他模型注册了同名的权限。

【讨论】:

  • permission_required = 'stores.add_material'。像这样,我正在为视图分配权限。代号add_material只有一个权限
  • 嗯,显然在某个地方还有另一个,否则你的 get 只会返回一个结果。我会用如何找到它的说明更新我的答案。
  • 谢谢Mad Wombat。是的,我明白了。有2个具有相同代号的权限
【解决方案2】:

添加到上述解决方案,您可以避免循环,只需使用简单的代码即可获得与以下代码名称相同的其他权限:

permissions = Permission.objects.filter(codename='add_material')
print(permissions)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2022-06-21
    相关资源
    最近更新 更多