优化查询以匹配和排除多个多对多条目
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)
您甚至可以将两者结合起来。
【讨论】:
以上是关于优化查询以匹配和排除多个多对多条目的主要内容,如果未能解决你的问题,请参考以下文章
Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?