从 Django QuerySet 中获取所有相关的多对多对象

Posted

技术标签:

【中文标题】从 Django QuerySet 中获取所有相关的多对多对象【英文标题】:Get all related many-to-many objects from a Django QuerySet 【发布时间】:2011-06-16 22:52:53 【问题描述】:

我有一个错综复杂的相互关联的 Django 模型,其中包含描述关系的多对多字段。

从 QuerySet 中获取相关模型的唯一成员列表的最简洁方法是什么?

如果我有一个 Item 模型,其中的组 ManyToMany 指向 Groups 模型。

如果我有一个项目的查询集,“项目”,我如何得到这个:

groups = items[0].groups.all().values_list('name', flat=True)

但是对于整个系列?我需要遍历它们并执行 set().intersect() 吗?

【问题讨论】:

【参考方案1】:

一种解决方案是使用 2 个查询。

您可以使用反向关系查询您的items 中的Item 指向的所有Groups。

groups = groups.objects.filter(item__in=items).distinct().values_list('name', flat=True)

【讨论】:

足够优雅。谢谢。 您可能还会发现使用flat=True 作为values_list 的参数很有用,它会将结果作为名称列表而不是名称元组列表返回。 @gorus -- 已更新。我觉得很有趣,我从原始帖子中删除了 flat ,因为我把它与 distinct 混淆了。

以上是关于从 Django QuerySet 中获取所有相关的多对多对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用附加过滤的相关对象作为 Django 中的字段来获取结果?

如何从 Django QuerySet 中获取绝对图像 URL 列表?

Django查询集QuerySet及两大特性

Django-queryset 每个字段获取一个对象=foo

查询集 QuerySet

从 Django Queryset 获取值列表的最有效方法