我正在开发一个标记系统,该系统需要查询具有多个标记的对象,并且能够排除具有标记的对象。下面的代码是我正在进行的查询的一个简单示例。实际上,将匹配/排除任意数量的标签。我当前的实现工作但对大量数据的速度很慢。我正在寻找一种加速此查询的方法。
class Model(models.Model):
tags = models.ManyToManyField(Tag)
Model.objects.filter(tags=tag_1).filter(tags=tag_2).exclude(tags=tag_3)
答案 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)
你甚至可以将两者结合起来。