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')