gpt4 book ai didi

python - Django taggit 聚合查询返回每个标签的计数

转载 作者:行者123 更新时间:2023-12-05 04:47:05 31 4
gpt4 key购买 nike

我正在使用 Django 3.2 和 django-taggit 1.4

我有这样一个模型:

class Meal(models.Model):
# some fields
is_cooked = models.Boolean()
tags = TaggitManager()

我正在尝试生成一个由标签名称和标 checkout 现次数值作为键值的字典 - 但仅适用于将 is_cooked 标志设置为 True 的餐点。

我尝试了以下方法:

pks = list(Meal.objects.filter(is_cooked=True))
ct = ContentType.objects.get_for_model(Meal)
b=TaggedItem.objects.filter(content_type=ct, object_id__in=pks).annotate(num_times=Count('tag__name'))

这没有返回预期的结果(而且我预计它可能会因为太多次查找而多次访问数据库 - 但我不想因过早的优化问题而分心。

我哪里做错了,如何获取每个标签的标签数?

[[编辑]]

下面是运行上述查询的结果:

<QuerySet [<TaggedItem: Meal One tagged with rice>, <TaggedItem: Meal Two tagged with chips>, <TaggedItem: Meal Three tagged with curry>, <TaggedItem: Meal Four tagged with royalty>, <TaggedItem: Meal Five tagged with rice>, <TaggedItem: Meal Six tagged with chips>]>


>>> b[0].num_times
1

最佳答案

您可以过滤注释:

from django.db.models import Count, Q
from taggit.models import Tag

Tag.objects.annotate(
nmeal=Count('meal'<strong>, filter=Q(meal__is_cooked=True)</strong>)
)

从这个查询集产生的 Tag 对象将有一个额外的属性 .nmeals,其中包含烹制餐的数量。

如果您只想检索至少有一份相关熟食的 Tag 对象,您可以使用:

from django.db.models import Count, Q
from taggit.models import Tag

Tag.objects.filter(
<strong>meal__is_cooked=True</strong>
).annotate(
nmeal=Count('meal')
)

关于python - Django taggit 聚合查询返回每个标签的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68627137/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com