2012-04-16 13 views
6

से पूरे क्वेरीसमूह मैं निम्नलिखित मॉडल:को शामिल न करें परिणाम

class LibraryEntry(models.Model): 
    player = models.ForeignKey(Player) 
    player_lib_song_id = models.IntegerField() 
    title = models.CharField(max_length=200) 
    artist = models.CharField(max_length=200) 
    album = models.CharField(max_length=200) 
    track = models.IntegerField() 
    genre = models.CharField(max_length=50) 
    duration = models.IntegerField() 
    is_deleted = models.BooleanField(default=False) 

    class Meta: 
    unique_together = ("player", "player_lib_song_id") 

    def __unicode__(self): 
    return "Library Entry " + str(self.player_lib_song_id) + ": " + self.title 

class BannedSong(models.Model): 
    lib_entry = models.ForeignKey(LibraryEntry) 

    def __unicode__(self): 
    return "Banned Library Entry " + str(self.lib_entry.title) 

मैं इस तरह एक प्रश्न करना चाहते हैं:

banned_songs = BannedSong.objects.filter(lib_entry__player=activePlayer) 
available_songs = LibraryEntry.objects.filter(player=activePlayer).exclude(banned_songs) 

मूल रूप से अगर एक गाना प्रतिबंध लगा दिया है, मैं बाहर करना चाहते हैं यह उपलब्ध गाने के मेरे सेट से। Django में ऐसा करने का कोई तरीका है?

+0

आप 'is_banned' एक अपने LibraryEntry मॉडल की बूलियन क्षेत्र नहीं बना सकते हैं? – jimw

+0

हां, लेकिन बहुत कम गीत वास्तव में उस संख्या की तुलना में प्रतिबंधित किए जाएंगे जो नहीं हैं। मैंने एक बूलियन क्षेत्र जोड़ना लगाया कि अधिकांश भाग केवल एक मूल्य होने वाला है, यह खराब रूप है। –

+1

मैं ऐसा नहीं कहूंगा, लेकिन मुझे लगता है कि यह स्वाद का विषय है। – jimw

उत्तर

11
banned_song_ids = (BannedSong.objects.filter(lib_entry__player=activePlayer) 
              .values_list('lib_entry', flat=True)) 

available_songs = (LibraryEntry.objects.filter(player=activePlayer) 
              .exclude('id__in' = banned_song_ids)) 

विकल्प है:

available_songs = (LibraryEntry.objects.filter(player=activePlayer) 
              .filter(bannedsong__isnull = True)) 
+0

मैंने वास्तव में इससे पहले यह कोशिश की और यह काम नहीं करता है। Django प्रत्येक सेट के आईडी फ़ील्ड की तुलना करता है। मैं चाहता हूं कि यह banned_songs सेट के lib_id फ़ील्ड के साथ लाइब्रेरी एंटर्री सेट के आईडी फ़ील्ड की तुलना करें। आईडी से आईडी की तुलना नहीं करें। –

+0

@ कुर्टिस नुस्बाम मैंने लिखा था कि इससे पहले कि मुझे एहसास हुआ कि 'banned_songs' एक ही मॉडल के बजाय एक अलग मॉडल से एक क्वेरीसेट था। मैंने इसे 'value_list' का उपयोग करने के लिए अपडेट किया। – agf

+0

बहुत बढ़िया। यह वास्तव में बहुत अच्छी तरह से काम करना चाहिए। हालांकि मैं banned_songs बड़े होने के मामले में कुछ प्रदर्शन मुद्दों से डरता हूं। लेकिन जैसे मैंने कहा, मुझे उम्मीद नहीं है कि यह बड़ा है। अगर मैं इसे विदेशी कुंजी के बजाय वनटोनफिल्ड बना देता हूं, तो क्या यह चीजें बदलता है? –

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