Django фильтр "многие ко многим

У меня есть много-много полей в модели пользователя, где один пользователь может иметь несколько ролей, например, администратор, пациент, доктор и другие. Теперь я хочу запросить данные, чтобы получить пользователей с ролями администратора и всех других, а не доктора и пациента. Я использую следующее

User.objects.exclude(roles__code_name__in=['pt', 'doc'])

Теперь мой один пользователь зарегистрировался как пациент, поэтому у него есть роли администратора и пациента, и теперь я не могу получить его, используя вышеуказанный запрос. Итак, вывод... если у пользователя есть две роли, если одна из них пациент, и у него есть любая другая роль, я хочу получить его тоже. что мне делать? Заранее спасибо

UPDATE

class User(AbstractBaseUser):
username                = models.CharField(max_length=30, unique=True)
email                   = models.EmailField(max_length=60, blank=True, null=True)
first_name              = models.CharField(max_length=30)
last_name               = models.CharField(max_length=30)
cnic                    = models.CharField(max_length=13, unique=True)
mobile                  = models.CharField(max_length=11, unique=True)
dob                     = models.DateField(blank=True, null=True)
full_name               = models.CharField(max_length=90, blank=True, null=True)
profile_image           = models.ImageField(max_length=255, upload_to=get_profile_image_path, null=True, blank=True, default=get_default_profile_image_path)
next_of_kin_name        = models.CharField(max_length=60, blank=True, null=True)
next_of_kin_mobile      = models.CharField(max_length=11, blank=True, null=True)
is_delete               = models.BooleanField(default=False)
status                  = models.IntegerField(default=0)
contact                 = models.CharField(max_length=10, blank=True, null=True)
hospital                = models.ForeignKey('Hospital', on_delete=models.SET_NULL, blank=True, null=True)
roles                   = models.ManyToManyField('Role', related_name='users')
is_staff                = models.BooleanField(default=False)
balance                 = models.PositiveIntegerField(default=0)
gender                  = models.CharField(max_length=10, choices=gender_choices, default=gender_choices[0][0])
phone_verified          = models.BooleanField(default=False)
created_at              = models.DateTimeField(auto_now_add=True)
created_by              = models.ForeignKey('self', related_name='+', blank=True, null=True, on_delete=models.CASCADE)
updated_at              = models.DateTimeField(auto_now=True)
updated_by              = models.ForeignKey('self', related_name='+', blank=True, null=True, on_delete=models.CASCADE)

Это моя модель, в ней есть роли как поле "многие ко многим". У меня есть несколько ролей, таких как доктор, пациент, администратор и многие другие, созданные на заказ роли с пользовательскими разрешениями. У меня есть представление, в котором я хочу получить данные пользователей, которые не являются пациентами или врачами. Все работало нормально, пока один из моих пользователей-администраторов не решил зарегистрироваться как пациент, поэтому у него теперь есть и роль пациента, и роль администратора, и теперь я не могу получить его, используя вышеупомянутый запрос

Эврика. Это решение отлично работает для меня, не знаю, идеальный ли это подход, но на данный момент он работает. Спасибо @all

User.objects.annotate(num_roles=Count('roles')).exclude(Q(id=self.request.user.id) | Q(is_delete=True) | Q(roles__code_name__in=['pt', 'doc', 'su']) & Q(num_roles=1)).order_by('-id')
Вернуться на верх