与Q对象不同的值

时间:2016-09-20 14:45:29

标签: python django

我在Py3上的Django项目1.10.1上有这个查询:

Event.objects.filter(Q(subject=topic.id) | Q(object=topic.id) | Q(place=topic.id))

如何防止获得两个相同的Event记录?

提前谢谢。

2 个答案:

答案 0 :(得分:4)

使用distinct运算符:

Event.objects.filter(Q(subject=topic.id) | Q(object=topic.id) | Q(place=topic.id)).distinct()

来自文档:

  

默认情况下,QuerySet不会消除重复的行。实际上,这很少是一个问题,因为像Blog.objects.all()这样的简单查询不会引入重复结果行的可能性。但是,如果您的查询跨越多个表,则在评估QuerySet时可能会获得重复的结果。那就是你使用distinct()。

在实施之前,请特别注意他们的“但是”条款,除非您希望实际看到重复的结果。

答案 1 :(得分:2)

我认为查询不能给出重复的结果。

我刚刚在类似的设置上尝试了类似的查询,它将转换为SQL查询,看起来大致如下:

SELECT * 
FROM event 
WHERE (subject=x OR object=x OR place=x)

这不会复制任何行,因此您实际上不需要做任何事情来避免重复记录。