結果

2012-04-16 16 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

あなたLibraryEntryモデルの 'is_banned' ブール型フィールドを作成することができませんか? – jimw

+0

はい、実際には禁止されている曲はほとんどありません。私はブール値のフィールドを追加すると考えていました。ブール値のフィールドは、ほとんどの場合、値が1つしかないことが悪いフォームです。 –

+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は各セットのidフィールドを比較します。 LibraryEntryセットのidフィールドとbanned_songsセットのlib_idフィールドを比較する必要があります。 idとidを比較しない。 –

+0

@KurtisNusbaum私は 'banned_songs'が同じモデルではなく、別のモデルからのクエリセットであることを理解する前に書きました。 'values_list'を使うように更新しました。 – agf

+0

実際にはうまくいくはずです。 banned_songsが大きい場合のパフォーマンス上の問題を恐れていますが、しかし、私が言ったように、私はそれが大きくなるとは予想していません。外字キーではなくOneToOneFieldにすると、それが変わるのですか? –