как получить доступ к полю из другого во многих отношениях? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть две модели «Пользователь» и «Роль». Ролевая модель выглядит следующим образом:

 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. фильтр (id = 1) возвращает так:

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

и, очевидно, это не то, что я хочу

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Вы можете запросить роль напрямую и проверить .exists():

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

(Обратите внимание, что я действительно не рекомендую использовать идентификатор в качестве выбора в модели роли. Используйте отдельное поле role.)

1 голос
/ 28 октября 2019

Например, если вы хотите узнать, является ли кто-то администратором:

В представлении:

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

Удачи!

...