如何用另一个many2many过滤many2many字段?

How to filter many2many field with another many2many?

我的 Django 中有以下模型:

class Filter(models.Model):
    min_price = models.PositiveIntegerField(null=False, blank=False)
    max_price = models.PositiveIntegerField(null=False, blank=False)
    trait = models.ManyToManyField(Trait, null=True, blank=True)

class Flat(models.Model):
    living_area = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True, db_index=True)
    trait = models.ManyToManyField(Trait)

class Trait(models.Model):
    name = models.CharField(max_length=255, blank=False, null=False, db_index=True)

在我的案例中,特征可以是例如:电梯。如果 Flat 和 Trait(name="Elevator") 之间存在联系,那么我可以假设 Flat 有电梯。

我想做的是根据特征搜索公寓 - 来自公寓的特征和来自过滤器的特征应该相同。

我是这样想的:

filte_obj = Filter.objects.get(pk=pk)
flat = Flat.objects.filter(trait__id__in=[x.id for x in filter_obj.trait.all()])

不幸的是我没有按照我的意愿工作。我只想查看 Traits QuerySet 与 Filter 的 traits QuerySet 相同的 Flats。

我该怎么做?

我已经使用 Django 模型注释解决了我的问题:

filter_obj = Filter.objects.get(pk=pk)
traits_list = [x.id for x in filter_obj.trait.all()]
offers = Offer.objects \
    .filter(flat__living_area__range=(filter_obj.min_area, filter_obj.max_area),
            flat__trait__id__in=traits_list) \
    .annotate(num_traits=Count('flat__trait')).filter(num_traits=filter_obj.trait.count())

更多信息: