【发布时间】:2018-01-25 20:24:03
【问题描述】:
我有这两个模型
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)
但我会为每组类别访问数据库。 这可以改进吗?
【问题讨论】:
标签: django postgresql django-models