2012-12-31 13 views
5

Bu SQL sorgusu Django ORM ifadesine nasıl çevrilebilir?Django ile başka bir tabloda olmayan değerleri seçin

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

Lütfen yardım edin! :)

PS
table1 ve in the docs gösterildiği gibi, ForeignKey veya ManyToMany

+1

neden '.raw()'? –

+0

Bu sorguyu ham yöntemde kullanmak çok fazla kayıtınız varsa kırık bir boruya neden olur –

cevap

8

iki Sorgu kümelerini kullanarak ile sınırlı değildir table2.

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

Bağlantı için teşekkürler, sayfanın bu bölümüne asla API :) ile ulaşmayın. - Bu yöntem etkin değildir. Django aracılığıyla Ham SQL benim durumumda 0,5 sn gibi ('fetchall()' dahil), iç içe sorguları ile yöntem 5 sn –

+0

alır Benim gibi şeyler için çok daha hızlı olmak için sık sık ham sql buldum ... özellikle eğer inner_qs büyüktür ... ama eğer varmıyorum eğer ham sql olarak eşdeğer yapmak için bir yol olabilir ... –

+2

Hafif bir gelişme; 'inner_qs = table2.objects.values_list ('field1' = Gerçek düz) sonuç = table1.objects.exclude (field1__in = inner_qs)' rağmen, kullanmak gerekir: Bazı durumlarda, fark yaratıyor Sorgunuzu gerçekten daha hızlı yapmak istiyorsanız, QuerySet yöntemi raw(). – trinchet

İlgili konular