优化查询以匹配和排除多个多对多条目

Posted

技术标签:

【中文标题】优化查询以匹配和排除多个多对多条目【英文标题】:Optimized query to match and exclude multiple ManyToMany entries 【发布时间】:2015-02-27 18:24:39 【问题描述】:

我正在开发一个标记系统,该系统需要查询具有多个标记的对象以及能够排除具有标记的对象。下面的代码是我正在进行的查询的一个简单示例。实际上,将匹配/排除任意数量的标签。我当前的实现工作但在大量数据上速度很慢。我正在寻找一种方法来加快这个查询。

class Model(models.Model):
    tags = models.ManyToManyField(Tag)

Model.objects.filter(tags=tag_1).filter(tags=tag_2).exclude(tags=tag_3)

【问题讨论】:

【参考方案1】:

如果您已经在帮助下将该行确定为罪魁祸首,例如django-debug-toolbar 我会尝试两件事:

使用 in 而不是不同的子句进行过滤

Models.objects.filter(tags__in=[tag_1, tag_2])

使用 ids 而不是对象进行过滤

Model.objects.filter(tags__id=tag_1.id).filter(tags__id=tag_2.id)

您甚至可以将两者结合起来。

【讨论】:

以上是关于优化查询以匹配和排除多个多对多条目的主要内容,如果未能解决你的问题,请参考以下文章

hibernate对象关系实现多对多实现

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

多对多、一对多或多对一

休眠查询以匹配映射实体集合与给定集合中的至少一个元素,多对多关系

Django admin,多对多字段,多个重复条目

hibernate多对多查询