장고 모델을 특정 조건으로 정렬

장고 모델을 특정 조건으로 정렬하고 싶습니다.



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를 작성하여 순서를 정렬할 수 있습니다.

참고 이미지


고찰, 감상



트렌드 기능 등은 이들에 한층 더 시간축의 설정도 실시하고 있다고 생각되므로, 더 공부해 실장할 수 있도록(듯이) 하고 싶다

좋은 웹페이지 즐겨찾기