Фильтр модели Django с "точным" оператором IN
Я хочу найти всех пользователей, у которых точно такие же теги, как у определенной категории (точно такие же теги, а также одинаковое количество присвоенных тегов)
Что-то вроде...
category = Category.objects.first()
User.objects.filter(tags__in=category.tags.filter())
Но это возвращает также пользователей, которые разделяют с категорией даже только один тег.
Модели являются
class User(models.Model):
tags = models.ManyToManyField(Tag, blank=True, related_name='users')
class Category(models.Model):
tags = models.ManyToManyField(Tag, blank=True, related_name='categories')
class Tag(models.Model):
name = models.CharField(max_length=255, blank=False)
Любое решение будет оценено по достоинству.
Не самое лучшее решение, но, возможно, сработает.
Итерация над User
набором запросов и фильтрация их по одному. пример:
category = Category.objects.first()
for tag in category.tags.all():
qs = User.objects.filter(tags__id=tag.id)
Другой:
category = Category.objects.first()
tag_ids = category.tags.values_list("id", flat=True)
valid_users = []
for user in User.objects.all():
user_tag_ids = user.tags.values_list("id", flat=True)
if set(user_tag_ids) == set(tag_ids):
valid_users.append(user)