【问题标题】:Permission matching query does not exist in custom permission自定义权限中不存在权限匹配查询
【发布时间】:2018-02-19 07:04:50
【问题描述】:
try:
        user = User.objects.get(username = 'xyz')
        custom_permission = Permission.objects.get(codename='is_custom')
        user.user_permissions.add(custom_permission)
        user.save()
        print user.has_perm("is_custom")
        print user.has_perm('app.is_custom')
        user.get_all_permissions()

    except Exception as e:
        print(">>>>>",e)

我已经做了这个简单的事情来检查用户自定义权限,但它引发了异常

DoesNotExist('权限匹配查询不存在。')

这有什么问题??

【问题讨论】:

  • 可能是个愚蠢的问题,但您确定已创建权限吗?
  • 是的,它是创建的,我已经仔细检查过
  • 只是确保 =) 我以前犯过这样的错误。你试过 django shell 中的查询吗?
  • 另外,请问你的 django 版本可以解决这个问题吗?
  • 我正在使用 Django 1.11 并创建了权限我也从管理面板检查过

标签: python django django-models permissions django-views


【解决方案1】:

get 如果没有模型对象满足给定条件,则应返回上述错误。即,没有代号为is_custom 的Permission 对象。您必须修改您的查询,例如,

custom_permission = Permission.objects.filter(codename='is_custom').first() # return Permission object if exists else None
if custom_permission:
    user.user_permissions.add(custom_permission)
    user.save()

【讨论】:

  • 现在它显示这个TypeError("int() argument must be a string or a number, not 'instancemethod'",) 如果我打印custom_permission 我得到bound method QuerySet.first of <QuerySet []
  • 在您的问题中发布完整的回溯。我确定您将方法传递给int 函数。
  • 我在first 之后添加了()。所以没有这个权限。
  • 这是我最新的代码 `try: user = User.objects.get(username = 'xyz') custom_permission = Permission.objects.filter(codename='DELETE').first() # return权限对象如果存在 else None 如果 custom_permission: print "in if" user.user_permissions.add(custom_permission) user.save() print "out if" print user.has_perm("DELETE") print user.has_perm('app.DELETE ') user.get_all_permissions() 例外为 e: print(">>>>>",e) `
  • in if out if False False 这是输出
【解决方案2】:

我创建这个是为了获得许可

from django.db import models class RightsSupport(models.Model): class Meta: managed = False permissions = (('DELETE', 'can delete'),)

在 saparerte 文件中并迁移。这在数据库中创建了类似的东西

应用名称 | YourClassContainingPermission |权限名称

就我而言

应用程序 |权利 |删除

所以现在如果我这样检查

request.user.has_perm('app.DELETE')

这会返回 true

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2016-03-29
    • 2013-09-28
    • 1970-01-01
    相关资源
    最近更新 更多