如何用另一个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())
更多信息:
我的 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())
更多信息: