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

时间:2015-02-27 18:24:39

标签: python django django-models query-optimization

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

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

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

1 个答案:

答案 0 :(得分:1)

如果您已经使用帮助确定该行是罪魁祸首,例如django-debug-toolbar我尝试了两件事:

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

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

  • 使用ID而不是对象

    进行过滤

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

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