2012-12-31 49 views
5

如何將此SQL查詢轉換爲Django的ORM語句?選擇與Django不在一個表中的值

SELECT field1, field2, field3 
FROM table1 
WHERE field1 NOT IN 
(SELECT 2_field1 FROM table2); 

請幫忙! :)

PS
table1table2不與ForeignKeyManyToMany

+1

爲什麼不使用'.raw()'? –

+0

在原始方法中使用該查詢會導致損壞的管道,如果您有太多記錄 –

回答

8

使用兩個查詢集界定,如圖所示in the docs

inner_qs = table2.objects.all() 
results = table1.objects.exclude(field1__in=inner_qs) 
+0

感謝您的鏈接,從來沒有達到與API的頁面的這一部分:)但這種方法效率不高。原始SQL通過Django在我的情況下需要0.5秒(包括'fetchall()'),嵌套查詢的方法需要5秒 –

+0

我經常發現原始sql對於像這樣的東西要快得多...特別是如果inner_qs很大......但是可能有一種方法可以像原始sql一樣執行相同的操作,如果有的話我還沒有找到它...... –

+2

略有改進;其中,在某些情況下,使其中的差別: 'inner_qs = table2.objects.values_list( '字段1',扁= TRUE) 結果= table1.objects.exclude(field1__in = inner_qs)' 雖然,你應該使用QuerySet方法'raw()',如果你想更快地做你的查詢。 – trinchet

相關問題