尝试通过计数 manytomany 字段 Django 对标签进行排序

Trying to sort tags by count manytomany field Django

感谢您花时间阅读我的 post,所以我会进入正题。

我尝试按照最常用的标签到最不使用的前 5 个值的顺序排列我最常用的标签,但我不知道如何。 这是我试过的:

models.py:


class Tag(models.Model):
    tag = models.CharField(max_length=250)

    def __str__(self):
        return self.tag


class BlogPost(models.Model): # blogpost_set -> queryset
    tags = models.ManyToManyField(Tag, null = True)

context_processor.py:

def blog_cat_tags(request):
    # Top Tags
    most_common = BlogPost.objects.values('tags').annotate(truck_count=Count('tags')).order_by('-truck_count')
    most_common_n = Tag.objects.values('tag').annotate(truck_count=Count('tag')).order_by('-truck_count')
    common_tags = []
    for tag in most_common:
        common_tags.append(tag)
    common_tags = common_tags[:5]

这是结果:

标签按顺序排列,但我无法获取名称,如果我从 most_common 变量更改为 most_common_nfor 我明白了。

但这不是正确的顺序。有什么想法吗?

你可以通过values

获取名字
def blog_cat_tags(request):

    most_common = BlogPost.objects.values('tags__tag').annotate(truck_count=Count(
         'tags')).order_by('-truck_count').values('tags__tag', 'truck_count')
    # Here you will get out put as
    # {'tags__tag':'Tag 1','truck_count':1} you can use it directly

    common_tags = []
    for tag in most_common:
        common_tags.append(tag['tags__tag'])
    common_tags = common_tags[:5]

抱歉回复晚了。 您只需使用如下查询即可实现此目的:

most_common = BlogPost.objects.values('tags__tag').annotate(truck_count=Count('tags')).order_by('-truck_count')[:5]

结果 (most_common) 将是:

[
    {'tags__tag': 'tag1', 'truck_count': 5}, 
    {'tags__tag': 'tag2', 'truck_count': 4},
    {'tags__tag': 'tag3', 'truck_count': 3}, 
    {'tags__tag': 'tag4', 'truck_count': 2},
    {'tags__tag': 'tag5', 'truck_count': 1}, 
]