删除查询集中的重复项

时间:2018-10-15 08:17:25

标签: python django django-queryset django-orm

我有一个类似下面的查询集,它描述了专辑和与那些专辑相关的歌曲。型号名称为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)

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

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  

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

或者在获取查询集之后,在转换为列表之前,我们可以从查询集中删除那些项吗?

1 个答案:

答案 0 :(得分:2)

您可以使用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')