尝试通过计数 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_n 在 for 我明白了。
但这不是正确的顺序。有什么想法吗?
你可以通过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},
]
感谢您花时间阅读我的 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_n 在 for 我明白了。
但这不是正确的顺序。有什么想法吗?
你可以通过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},
]