2016-09-20 62 views
0

我有這個疑問在我的Django項目1.10.1上PY3:符合Q不同的值對象

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

如何避免讓兩個完全相同的Event記錄?

預先感謝您。

+0

該查詢不應該給重複的事件。如果一個事件具有'subject = topic.id'和'object = topic.id',它將只在查詢集中出現一次。 – Alasdair

回答

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

我不認爲這個查詢可以給出重複的結果。

我只是想在我類似的設置類似的查詢時,它會轉換爲SQL查詢,看起來大致是這樣的:

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

這不會複製任何行,所以你實際上並不需要做任何事情以避免重複記錄。

+1

我認爲這不應該被低估。認爲查詢不會重複行要比在不需要時向查詢集添加'distinct()'要好。 – Alasdair