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

标签 django django-models django-queryset

假设我有一个包含很多字段的模型,但我只关心一个字符字段。可以说 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/

相关文章:

python - 检查 F 对象的结果是否大于零

python - 使用 Python 从数据库中删除记录

python - pinax 错误 : no module named debug toolbar

python - Django:过滤自引用外键属性

python - django 翻译不适合我

javascript - 当 django 中未提供任何输入字段时,Ajax 函数不会执行

python - django 智能十进制字段

python - 如何使用 django rest 框架从 GET 请求的查询参数中过滤多个 id?

python - Django 管理中的多对多问题

python - 仅处理 Django 中查询集的子集(并返回原​​始查询集)