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でこれを行う方法はありますか?

4

1 に答える 1

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))
于 2012-04-16T23:20:15.733 に答える