使用初始模型django注释多对多

时间:2018-01-25 20:24:03

标签: django postgresql django-models

我有这两个模型

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)

但是我会针对每组类别点击数据库。 这可以改善吗?

1 个答案:

答案 0 :(得分:0)

使用以下内容在单个查询中获取所有内容:

categories = Category.objects.annotate(n_words=Count('word_set'))
for category in categories:
    print('{category.name} ({category.n_words})'.format(category))