简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM