首页 > 解决方案 > 如何根据相似的值将结果分组到数组中,Django Model/Serializers

问题描述

另外:如何根据 django 中的相同值对模型数据进行分组

还有 2:根据值对序列化程序结果进行分组

像上面的其他人一样,我需要以特定方式返回的结果。我想将包含一列相似值的结果组合在一起。

如上所述,我想这样做:

 album |             title |    singer
-------+-------------------+----------
     1 |  exampleSongTitle |   someone 
     1 |  exampleSongTitle |   sometwo
     2 |  exampleSongTitle | somethree
     2 |  exampleSongTitle |   someone

得到这个

[
  {
    "album": 1,
    "tracks": [
      {
        "title": exampleSongTitle,
        "singer": someone
      },
      {
        "title": exampleSongTitle,
        "singer": sometwo
      }
    ]
  },
  {
    "album": 2,
    "tracks": [
      {
        "title": exampleSongTitle,
        "singer": somethree
      },
      {
        "title": exampleSongTitle,
        "singer": someone
      }
    ]
  }
]

我的模型:

class Songs(models.Model):
    title = models.CharField(db_column='Title', max_length=400, blank=True, null=True)
    album = models.CharField(db_column='Album', max_length=400, blank=True, null=True)
    singer = models.CharField(db_column='Singer', max_length=400, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Songs'

专辑值将是来自同一专辑的曲目的相同值。

标签: djangodjango-rest-framework

解决方案


由于表格看起来相当平坦,因此您必须在从数据库中获取结果后进行格式化/分组。您可以使用itertools.groupby来执行此操作

result = []
for album, songs in itertools.groupby(Song.objects.order_by('album'), lambda s: s.album):
    result.append({
        "album": album,
        "tracks": [{
            "title": song.title,
            "singer": song.singer
        } for song in songs]
    })

推荐阅读