Django

2012-12-31 10 views
5

के साथ किसी अन्य तालिका में नहीं मानों का चयन करें Django ORM कथन में इस SQL ​​क्वेरी का अनुवाद कैसे किया जा सकता है?Django

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

कृपया मदद करें! :)

ps
table1 और table2 दिखाया गया है in the docs, ForeignKey या ManyToMany

+1

'.raw()' का उपयोग क्यों नहीं करें? –

+0

कच्चे विधि में उस क्वेरी का उपयोग करना टूटी हुई पाइप का कारण बनता है यदि आपके पास बहुत सारे रिकॉर्ड हैं –

उत्तर

8

दो क्वेरीसमूहों का उपयोग के साथ घिरा नहीं।

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

लिंक के लिए धन्यवाद, एपीआई के साथ पेज के इस हिस्से तक कभी नहीं पहुंचें :) लेकिन यह विधि कुशल नहीं है। Django के माध्यम से कच्चे एसक्यूएल मेरे मामले में 0,5 सेकंड की तरह लेता है ('fetchall() 'सहित), नेस्टेड प्रश्नों के साथ विधि 5 सेकंड –

+0

लेती है मुझे अक्सर कच्चे वर्ग को इस तरह की चीजों के लिए बहुत तेज़ लगता है ... विशेष रूप से यदि आंतरिक_क्यू बड़ा है ... लेकिन कच्चे वर्ग के बराबर करने का एक तरीका हो सकता है, अगर मुझे यह पता चला है ... –

+2

मामूली सुधार; 'inner_qs = table2.objects.values_list ('फ़ील्ड 1', फ्लैट = सच) परिणाम = table1.objects.exclude (field1__in = inner_qs)' हालांकि, आप का उपयोग करना चाहिए: जो, कुछ मामलों में, फर्क नहीं पड़ता QuerySet विधि 'raw()', यदि आप वास्तव में अपनी क्वेरी करना चाहते हैं। – trinchet