LoginSignup
1
0

More than 3 years have passed since last update.

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

Posted at

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を作成することで順番をソートすることができます。

参考画像
スクリーンショット (13).png

考察、感想

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0