我有这两个模型
class Word(Model):
word = CharField()
categories = ManyToManyField('Category')
class Category(Model):
name = CharField()
我想要做的是输出每组类别的单词数量:
General (3 words)
General, IT (7 words)
Medicine (1 word)
Archaic Words, IT (10 words)
这意味着,例如,有3个单词,只有一个类别,即General。
在尽可能少的查询中完成它的方法是什么?
第一步是获取所有可能的集合,我使用PostgreSQL:
all_sets = Word.objects.annotate(category_names=ArrayAgg('categories__name')).values_list('category_names', flat=True).distinct()
下一步是什么? 当然,我可以获取每组的单词数量:
for category_set in all_sets:
queryset = Word.objects.annotate(n=Count('categories')).filter(n=len(category_set))
for cat in category_set:
queryset = queryset.filter(categories__name=cat)
但是我会针对每组类别点击数据库。 这可以改善吗?
答案 0 :(得分:0)
使用以下内容在单个查询中获取所有内容:
categories = Category.objects.annotate(n_words=Count('word_set'))
for category in categories:
print('{category.name} ({category.n_words})'.format(category))