django – 从结果中排除整个QuerySet

前端之家收集整理的这篇文章主要介绍了django – 从结果中排除整个QuerySet前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下型号:
  1. class LibraryEntry(models.Model):
  2. player = models.ForeignKey(Player)
  3. player_lib_song_id = models.IntegerField()
  4. title = models.CharField(max_length=200)
  5. artist = models.CharField(max_length=200)
  6. album = models.CharField(max_length=200)
  7. track = models.IntegerField()
  8. genre = models.CharField(max_length=50)
  9. duration = models.IntegerField()
  10. is_deleted = models.BooleanField(default=False)
  11.  
  12. class Meta:
  13. unique_together = ("player","player_lib_song_id")
  14.  
  15. def __unicode__(self):
  16. return "Library Entry " + str(self.player_lib_song_id) + ": " + self.title
  17.  
  18. class BannedSong(models.Model):
  19. lib_entry = models.ForeignKey(LibraryEntry)
  20.  
  21. def __unicode__(self):
  22. return "Banned Library Entry " + str(self.lib_entry.title)

我想做这样的查询

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

基本上如果一首歌被禁止,我想把它从我的可用歌曲中排除.有没有办法在Django中这样做?

解决方法

  1. banned_song_ids = (BannedSong.objects.filter(lib_entry__player=activePlayer)
  2. .values_list('lib_entry',flat=True))
  3.  
  4. available_songs = (LibraryEntry.objects.filter(player=activePlayer)
  5. .exclude('id__in' = banned_song_ids))

替代方案是:

  1. available_songs = (LibraryEntry.objects.filter(player=activePlayer)
  2. .filter(bannedsong__isnull = True))

猜你在找的Python相关文章