如何从一个多对多关系中访问另一个字段?

时间:2019-10-28 19:06:22

标签: django django-models

我有两个模型“用户”和“角色”。榜样是这样的:

 class Role(models.Model):
     ADMIN = 1
     INFORMATIC = 2
     REFEREE = 3
     SPONSER = 4
     STAFF = 5
     PLAYER = 6
     CUSTOMER =7
     VISITOR = 8

     ROLE_CHOICES = (
        (1, 'admin'),
        (2, 'informatic'),
        (3, 'referee'),
        (4, 'sponser'),
        (5, 'staff'),
        (6, 'player'),
        (7, 'customer'),
        (8, 'visitor'),
     )
     id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True , 
        default=VISITOR)

这是我的用户模型:

 class User(AbstractBaseUser,PermissionsMixin):
    username = models.CharField(max_length=150, unique=True, blank=True , null=True,)
    password = models.CharField(max_length=100, null=True , blank=True)

    roles = models.ManyToManyField(Role)

现在我已经创建了一些角色对象和一些用户,并将一些角色分配给了一些用户。现在我想知道如何确定哪个用户具有哪些角色?从请求我有用户。我想知道某个用户是否具有某个角色(例如,赞助者)并授予他一些权限。 我该如何检查?

编辑 当我使用usrobj.roles.filter()时,它返回如下内容:

<QuerySet [<Role: (2, 'informatic')>, <Role: (3, 'referee')>]>

并使用userobj.roles.filter(id = 1)返回如下:

<QuerySet [<Role: (2, 'informatic')>]>

显然这不是我想要的

2 个答案:

答案 0 :(得分:2)

您可以直接查询角色并检查.exists()

request.user.roles.filter(id=1).exists()

(注意,我真的不建议在角色模型中使用ID作为选择。使用单独的role字段。)

答案 1 :(得分:1)

例如,如果您想知道某人是否是管理员:

在视图中:

admin_role = Role.objects.get(id=1)
admin_users = User.objects.filter(roles__in=admin_role)

# To check if a user is admin
if admin_role in user.roles.all():
    pass

祝你好运!