如何过滤和访问 Django QuerySet 中的多对多字段?

Posted

技术标签:

【中文标题】如何过滤和访问 Django QuerySet 中的多对多字段?【英文标题】:How to filter and access ManyToMany fields in a Django QuerySet? 【发布时间】:2018-10-19 13:36:12 【问题描述】:

假设我有以下具有多对多关系的模型:

class City(models.Model):
    name = models.CharField(max_length=100)

class Course(models.Model):
    name = models.CharField(max_length=100)
    cities = models.ManyToManyField(City)

现在我想过滤给定城市中具有给定名称的课程:

courses = Course.objects.filter(name='Course1', cities__name='City1')

是否可以通过courses QuerySet 访问City 字段?在这个例子中,是否有可能只从courses 得到'City1'

提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用prefetch_related 和Prefetch object 来执行此操作。

city1 = City.objects.filter(name='City1')
courses = Course.objects.filter(name='Course1', cities__name='City1').prefetch_related(
    Prefetch('cities', queryset=city1)
)

【讨论】:

以上是关于如何过滤和访问 Django QuerySet 中的多对多字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在django中将QuerySet过滤到每个组的最大成员?

如何过滤 Django QuerySet 的相关字段“全部”或“无”

Django QuerySet - 如何“禁用”以前的过滤值

Django Admin:获取根据 GET 字符串过滤的 QuerySet,与更改列表中看到的完全一样?

在 Django 中过滤 Queryset 并设计正确的 urls.py 和模板

如何在 django 中过滤查询集的多对多