Django 查询集过滤具有相同多对多字段的对象

Posted

技术标签:

【中文标题】Django 查询集过滤具有相同多对多字段的对象【英文标题】:Django queryset to filter objects with identical manytomany field 【发布时间】:2020-06-16 19:40:00 【问题描述】:

我有一个这样的模型。

class Component(models.Model):
     options = models.ManyToManyField('prices.Option')
     period = models.IntegerField()

我需要选择与一个组件cmp具有相同周期和相同选项的所有组件。此查询集不起作用。

similar_components = Component.objects.filter(period=cmp.period, options=cmp.options)

我找不到基于这个多对多字段 options 的查询集的方法。

【问题讨论】:

你能试试这个吗,similar_components = Component.objects.filter(period=cmp.period, options=[cmp.options]) @kamilyrb 这行不通。我现在会更正我的答案 你可以看看this。您的问题有答案。 【参考方案1】:

Many-to-many relationships

from django.db.models import Q

options = cmp.options.all()
filter_kwargs = (Q(options=option) for option in options)
similar_components = Component.objects.filter(period=cmp.period).filter(*filter_kwargs)

【讨论】:

他想要相同的选项,此查询返回包含 cmp.options 的组件。但也有额外的选择。

以上是关于Django 查询集过滤具有相同多对多字段的对象的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中获取具有多对多关系的复杂查询集

根据特定的多对多关系过滤 Django 查询集

Django DRF 视图过滤多对多查询集

Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项

在 django 中查询多对多字段会产生一个空查询集

在 Django Admin 中过滤多对多框