假设我有一个包含很多字段的模型,但我只关心一个字符字段。可以说 charfield 可以是任何东西,所以我不知道可能的值,但我知道这些值经常重叠。所以我可以有 20 个带有“abc”的对象和 10 个带有“xyz”的对象,或者我可以有 50 个带有“def”的对象和 80 个带有“stu”的对象,我有 40000 个没有重叠,我真的不在乎。
如何有效地计数对象?我想要返回的是这样的:
{'abc': 20, 'xyz':10, 'other': 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 的聚合函数,这就是我一直遇到所有问题的原因。
最佳答案
你想要类似于“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))
关于此主题的先前问题:
关于django 计算查询中相同字段值的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3606416/