django在查询中计算相同字段值的最有效方法

Dan*_*Man 45 django django-models django-queryset

比方说,如果我有一个有很多领域的典范,但我只关心一个charfield.让说charfield可以是任何东西,所以我不知道可能的值,但我知道,频繁的值重叠.所以,我可以有20个对象与"ABC"和10个对象与"XYZ"我也可以有"高清"和80"STU" 50个对象和我有40000没有重叠,我真的不关心.

如何有效地计算对象?我想要归还的是:

{'abc':20,'xyz':10,'其他':10,000}

或类似的东西,没有进行大量的SQL调用.

编辑:

我不知道是否有人会看到这个,因为我编辑它有点晚了,但是......

我有这个型号:

class Action(models.Model):
    author = models.CharField(max_length=255)
    purl = models.CharField(max_length=255, null=True)

从答案中,我做到了这一点:

groups = Action.objects.filter(author='James').values('purl').annotate(count=Count('purl'))

但...

这是什么组:

{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "lora"}

(我只是用虚拟值填充了purl)

我想要的是什么

{'waka': 4, 'mora': 5, 'lora': 1}

希望有人会看到这个编辑...

编辑2:

显然,我的数据库(BigTable的)不支持的Django的聚合函数,这就是为什么我一直有所有问题.

bee*_*jay 80

你想要类似"count ... group by"的东西.您可以使用django的ORM的聚合功能执行此操作:

from django.db.models import Count

fieldname = 'myCharField'
MyModel.objects.values(fieldname)
    .order_by(fieldname)
    .annotate(the_count=Count(fieldname))
Run Code Online (Sandbox Code Playgroud)

以前有关此主题的问题:

  • 谢谢你的回答。这是在注释之前提到 order_by 的唯一答案,这是必需的。 (3认同)

Dan*_*man 16

这称为聚合,Django 直接支持它.

您可以通过在一组数据库调用中过滤要计数的值,获取值列表并计算它们来获取您的确切输出:

from django.db.models import Count
MyModel.objects.filter(myfield__in=('abc', 'xyz')).\
        values('myfield').annotate(Count('myfield'))
Run Code Online (Sandbox Code Playgroud)


Man*_*dan 7

您可以在查询Count 上使用Django的聚合来完成此任务.像这样的东西:

from django.db.models import Count
queryset = MyModel.objects.all().annotate(count = Count('my_charfield'))
for each in queryset:
    print "%s: %s" % (each.my_charfield, each.count)
Run Code Online (Sandbox Code Playgroud)