我有以下型号:
class Item(models.Model):
unique_code = models.CharField(max_length=100)
category_code = models.CharField(max_length=100)
label = models.CharField(max_length=100)
我想得到:
使用的 category_codes 的计数
使用的 unique_codes 的计数
使用的 category_code和unique_code 组合的计数
有什么想法吗?
答案 0 :(得分:3)
按要求提供Django / SQL解决方案:
使用的不同 category_codes 的计数:
category_codes_cnt = Item.objects.values('category_codes').distinct().count()
使用的 unique_codes 的计数:
unique_codes_cnt = Item.objects.values('unique_codes').distinct().count()
使用的 category_code和unique_code 组合的计数:
codes_cnt = Item.objects.values('category_codes', 'unique_codes').distinct().count()
答案 1 :(得分:1)
不要浪费太多时间来尝试精巧的SQL解决方案。
from collections import defaultdict
count_cat_code = defaultdict(int)
count_unique_code = defaultdict(int)
count_combo_code = defaultdict(int)
for obj in Item.objects.all():
count_cat_code[obj.category_code] += 1
count_unique_code[obj.unique_code] += 1
count_combo_code[obj.category_code,obj.unique_code] += 1
那就行了。它会很快地运作。实际上,如果你做一些基准测试,你可能会发现 - 有时候 - 它和“纯SQL”语句一样快。
[为什么呢?因为RDBMS必须使用相当低效的算法来执行GROUP BY和Counts。在Python中,我们可以根据我们的应用程序假设一些东西 我们对数据的了解。在这种情况下,例如,我认为它都适合 在记忆中。 RDBMS内部算法无法做出的假设。]
答案 2 :(得分:0)
select count(distinct unique_code) as unique_code_count,
count(distinct category_code) as category_code_count,
count(*) as combination_count
from (select unique_code, category_code, count(*) as combination_count
from item
group by unique_code, category_code) combination