【问题标题】:Django model filter with "exact" IN operator带有 \"exact\" IN 运算符的 Django 模型过滤器
【发布时间】:2022-11-16 20:42:13
【问题描述】:

我想找到所有具有与特定类别完全相同的标签的用户(完全相同的标签以及分配的相同数量的标签)

就像是...

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)

任何解决方案表示赞赏。

【问题讨论】:

标签: python django django-models


【解决方案1】:

不是最好的解决方案,但可能会奏效。

遍历 User queryset 并一一过滤。例子:

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)

【讨论】:

  • 谢谢你。我将其标记为解决方案,因为它回答了问题。另一方面,我的主要观点是为 1+M 条记录找到高性能算法。我考虑了更多,如果我进一步提高性能,我会进入位掩码方向,比如位掩码属性。 findnerd.com/list/view/Bitmask-Attributes-in-Rails/21215 有了它们,我们可以将多个属性存储在一个整数中,然后轻松地将它们与相等运算符进行比较。
猜你喜欢
  • 2018-09-29
  • 2016-06-16
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2022-10-19
相关资源
最近更新 更多