2015-10-04 13 views
6

मैं की तरह तोDjango 1.7 बाईं बाहरी में शामिल होने

class Job(models.Model): 
    description = models.CharField(max_length=255) 
    user = models.ForeignKey(User) 
    date = models.DateField() 
    slot = models.CharField(max_length=10, choices=SLOT_CHOICES) 
    location = models.ForeignKey(Location)   
    objects = JobManager() 
    searches = geomodels.GeoManager() 

    class Meta: 
     verbose_name_plural = "Job" 
     unique_together = ('date', 'slot', 'user') 

    def __str__(self): 
     return "{0}-{1}".format(self.user.first_name, self.date) 

class Applied(models.Model): 
    user = models.ForeignKey(User) 
    job = models.ForeignKey(Job, null=True, blank=True) 
    action_taken = models.BooleanField(default=False) 
    is_declined = models.BooleanField(default=False) 

    class Meta: 
     verbose_name_plural = "Job Applications" 
     unique_together = ('user', 'job',) 

मैं एक तिथि सीमा के बीच सभी नौकरियों के लिए खोज और दिखाने के एक उपयोगकर्ता आवेदन कर सकते हैं कि क्या करना चाहते हैं एक मॉडल है, पहले से ही लागू किया गया है या मना कर दिया गया है। आवेदन जानकारी लागू मॉडल में है।

jobs = Job.searches.filter(**kwargs)\ 
     .filter(date__range=(date_from, date_to), 
       visibility=VisibilityStatus.PUBLIC, 
       status=JobStatus.AVAILABLE)\ 
     .prefetch_related('applied_set')\ 
     .select_related('user__surgeryprofile__location')\ 
     .order_by('date') 

लेकिन मुझे यह काम नहीं मिल रहा है, यह डेटाबेस में लागू तालिका पर बाएं नहीं है। कोई सुझाव यह कैसे काम कर रहा है।

धन्यवाद

+0

मुझे पूछने के लिए माफ कर दो, लेकिन एक आंतरिक शामिल पर्याप्त नहीं होगा? – e4c5

+0

इनर में शामिल होने के केवल पंक्तियों को दोनों तालिकाओं में मौजूद लाएगा, मैं एक बाहर छोड़ दिया में शामिल होने के रूप में मैं तिथि सीमा और लागू मेज से पंक्तियों के बीच काम तालिका वाली सभी पंक्तियां ही उपयोगकर्ता पहले कि नौकरी के लिए आवेदन किया चाहते हैं और अगर इसके लिए किया गया चाहते हैं इंकार कर दिया। –

+1

आपका कोड आप सही परिणाम (एक applied_set जो खाली हो सकता है के साथ फ़िल्टर्ड नौकरियों) देखते हैं, भले ही देना चाहिए नहीं मिलती है। "ज्यादातर मामलों में prefetch_related एक एसक्यूएल क्वेरी का उपयोग कर लागू किया जाएगा जो 'आईएन' ऑपरेटर का उपयोग करता है।" https://docs.djangoproject.com/en/1.7/ref/models/querysets/#prefetch-related – JimmyYe

उत्तर

4

Django ORM प्रदर्शन वाम बाहरी शामिल हों जब FK के हैं नल

समाधान: सिर्फ इस FK job = models.ForeignKey(Job, null=True, blank=True) पर null=True जोड़ने आप हो रही nulls में शामिल करना चाहते हैं और Django अंदरूनी वाम बाहरी द्वारा शामिल हों शामिल हों बदल जाएगा।

यह तार्किक है, में शामिल होने के लिए छोड़ दिया बाहरी के रूप में समझ में जब लक्षित तालिकाओं में सटीक मिलान क्वेरी में सबसे-बाएँ तालिका प्रचलित नहीं हो सकता है।

अद्यतन: यह केवल विदेशी के क्षेत्र के लिए काम करता है और select_related, prefetch_related के साथ कईToMany फ़ील्ड के लिए नहीं।

M2M क्षेत्रों के लिए संभव समाधान:

  1. डीबग एसक्यूएल (डीबग = सच, लकड़हारा के साथ प्रवेश करने 'django.db.backends')
  2. इसे कॉपी और की जगह अंदरूनी वाम के साथ शामिल हों उत्पन्न बाहरी शामिल हों
  3. प्रदर्शन करना Model.objects.raw (sql_with_left_join)

https://docs.djangoproject.com/en/1.8/topics/db/sql/#performing-raw-sql-queries

इस से पहले, लेकिन उन नौकरी कि एप्लाइड साथ M2M नहीं है जोड़ने से एक ही परिणाम देना चाहिए।

UPDATE2: कस्टम संस्करणों < = 1.5 के लिए Django में शामिल होता है, 1.6+

इस ब्लॉग प्रविष्टि में मिला पर काम नहीं कर: https://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

StackOverflow से: https://stackoverflow.com/a/12943120/1090700

+0

चीयर्स, जो समझ में आता है। इसे जाने देंगे –

+0

मैंने आपके सुझाव के अनुसार मॉडल अपडेट किया है लेकिन अभी भी काम नहीं कर रहा है। मुझे क्वेरी में लागू तालिका का कोई संदर्भ नहीं मिल रहा है। –

+0

यह शायद कई लोगों के कारण है, जो मैं कह रहा था वह चुनिंदा_संबंधित और विदेशीकी के लिए था, परीक्षण के बाद, जांच की गई कि एम 2 एम में ऐसा नहीं कर रहा है। यदि आप एम 2 एम को एक बाएं बाहरी जॉइन के साथ छोड़ना चाहते हैं तो आपको शायद जॉब.बोजेक्ट.श्रा बनाना होगा (बस एसक्यूएल जेनरेट करें और बाएं आउट जॉइन जॉइन द्वारा इनर जॉइन को प्रतिस्थापित करें): https://docs.djangoproject.com/en /1.8/topics/db/sql/#performing-raw-sql-queries – danigosa

संबंधित मुद्दे