删除查询集中的重复项
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 中显示它。Sri
、Mouse
有多个条目,因为他们发布了多首歌曲。在前端,这些歌曲以专辑和歌曲作为条目显示在 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
条目也会显示。我不想只显示 Sri
、Mouse
的空条目。我想显示 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')
我有一个类似于下面的查询集,它描述了专辑和与这些专辑相关的歌曲。模型名称是 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 中显示它。Sri
、Mouse
有多个条目,因为他们发布了多首歌曲。在前端,这些歌曲以专辑和歌曲作为条目显示在 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
条目也会显示。我不想只显示 Sri
、Mouse
的空条目。我想显示 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')