【问题标题】:How to filter many2many field with another many2many?如何用另一个many2many过滤many2many字段?
【发布时间】:2021-12-02 15:44:28
【问题描述】:

我的 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 有电梯。

我想做的是根据特征搜索单位 - 来自 Flat 的特征和来自 Filter 的特征应该是相同的。

我是这样想的:

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 的特征 QuerySet 相同的 Flats。

我该怎么做?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    我已经使用 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())
    

    更多信息:

    Django filter by many to many with exact same query

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多