djangoのモデルを特定の条件でソートする


djangoのモデルを特定の条件でソートしたい

models.py
class Tag(models.Model):
    # タグに振られるID
    tag_id = models.AutoField(primary_key=True, verbose_name='タグID')
    # タグの名前
    tag_name = models.CharField(max_length=20, verbose_name='タグ名')

    def __str__(self):
        return str(self.tag_name)

class IdeaTagMap(models.Model):
    ideatag_id = models.AutoField(primary_key=True, verbose_name='アイデアタグのID')
    # 紐づけられる投稿
    idea = models.ForeignKey(PostIdea, on_delete=models.CASCADE)
    # 紐づけられるタグ
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.idea) + '_' + str(self.tag)

このようなモデルがあった時、Tagモデルは基本的に追加された順に表示されるが、その表示順をIdeaTagMapで参照された回数順に表示できるようにしたい。

方法としてはmodels.Managerを利用するのが一番早そう

models.py
# TagManagerとして追加
class TagManager(models.Manager):
    # IdeaTagMapでそれぞれのタグが何回使われているかを表示し、多い順にソートする。
    def get_queryset(self):
        return super().get_queryset().annotate(
            ideatagmap_count= models.Count('ideatagmap')
        ).order_by('-ideatagmap_count')

class Tag(models.Model):
    tag_id = models.AutoField(primary_key=True, verbose_name='タグID')
    tag_name = models.CharField(max_length=20, verbose_name='タグ名')
    # 追加
    objects = TagManager()

    def __str__(self):
        return str(self.tag_name) + '(' + str(self.ideatagmap_count) + ')'

class IdeaTagMap(models.Model):
    ideatag_id = models.AutoField(primary_key=True, verbose_name='アイデアタグのID')
    # 紐づけられる投稿
    idea = models.ForeignKey(PostIdea, on_delete=models.CASCADE)
    # 紐づけられるタグ
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.idea) + '_' + str(self.tag)

このTagManagerを作成することで順番をソートすることができます。

参考画像

考察、感想

トレンド機能などはこれらにさらに時間軸の設定も行っていると考えられるので、もっと勉強して実装できるようにしたい