[英]How to filter many2many field with another many2many?
I have following model in my Django:我的 Django 中有以下 model:
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)
In my case trait can be for example: elevator.在我的情况下,特征可以是例如:电梯。 If there is connection between Flat and Trait(name="Elevator") then I can assume that Flat has elevator.
如果 Flat 和 Trait(name="Elevator") 之间有联系,那么我可以假设 Flat 有电梯。
What I want to do is to searching flats based on traits - traits from Flat and traits from Filter should be the same.我想要做的是根据特征搜索单位 - 来自 Flat 的特征和来自 Filter 的特征应该是相同的。
I did somethink like this:我做了一些这样的想法:
filte_obj = Filter.objects.get(pk=pk)
flat = Flat.objects.filter(trait__id__in=[x.id for x in filter_obj.trait.all()])
Unfortunately I does not work as I want.不幸的是,我没有按我的意愿工作。 I want to see only Flats which Traits QuerySet is the same as Filter's traits QuerySet.
我只想查看 Traits QuerySet 与 Filter 的特征 QuerySet 相同的 Flats。
How can I do that?我怎样才能做到这一点?
I have solved my problem using django models annotations:我已经使用 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())
More information:更多信息:
Django filter by many to many with exact same query Django 使用完全相同的查询进行多对多过滤
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.