我在用户模型中有多对多的字段,其中一个用户可以有多个角色,例如管理员,病人,医生和其他人。现在我想查询数据,以获得用户与管理员和所有其他角色,而不是医生和病人的角色。我正在使用这个
User.objects.exclude(roles__code_name__in=['pt', 'doc'])
现在我的一个用户也注册为病人,所以他有管理员和病人的角色,现在我无法通过使用上面的查询得到他。所以得出结论…如果用户有两个角色如果其中一个是耐心,他也有其他角色,我也想要他。我该怎么办?提前感谢
更新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')