删除查询集中的重复项

Remove duplicates in the query set

我有一个类似于下面的查询集,它描述了专辑和与这些专辑相关的歌曲。模型名称是 UserSongs

<QuerySet [{'id': 1, 'album': 'Sri', 'song': 'in the end','release': 2017},
{'id': 2, 'album': 'Adi', 'song': 'cafe mocha','release': 2016}, 
{'id': 3, 'album': 'Shr', 'song': 'smooth criminal','release': 2016}, 
{'id': 4, 'album': 'Mouse', 'song': 'trooper','release': 2017},
{'id': 5, 'album': 'Mouse', 'song': 'my mobile','release': 2015},
{'id': 6, 'album': 'Sri', 'song': 'my office','release': 2018},
{'id': 7, 'album': 'Sri', 'song': 'null','release': null},
{'id': 8, 'album': 'Mouse', 'song': 'null','release': null}]>

在后端,我将查询集转换为列表。请参阅下面的代码:

albums_songs = UserSongs.objects.filter(album__in = 
['Sri','Mouse']).values('albums','songs')
list_albums_songs = list(albums_songs)

我将此列表发送到前端,以便在 table 中显示它。SriMouse 有多个条目,因为他们发布了多首歌曲。在前端,这些歌曲以专辑和歌曲作为条目显示在 table 中。查询集中的每一项都显示为一行。喜欢下面的。

Album   Songs
Sri     in the end
Adi     cafe mocha
Adi     null
Shr     smooth criminal
Mouse   trooper
Mouse   my mobile
Sri     my office 
Sri     null 
Mouse   null  

但在 table 中,歌曲的 null 条目也会显示。我不想只显示 SriMouse 的空条目。我想显示 song=null doe Adi。我可以在转换为列表并遍历列表后将其删除。但这是昂贵的。我相信我们可以在 Django 查询本身中做到这一点。比如,如果专辑是 Sri 或 Mouse,则检查 song = null 并且不要获取该条目。

或者在得到query set之后,在转换成list之前,是否可以将那些item从query set中移除?

您可以使用 isnull 过滤器:

albums_songs = UserSongs.objects.filter(album__in=['Sri','Mouse'], songs__isnull=False).values('albums','songs')

编辑:根据更新后的问题中的新要求,您应该改用 exclude 方法:

albums_songs = UserSongs.objects.exclude(album__in=['Sri','Mouse'], songs__isnull=True).values('albums','songs')