假设我有一个拥有许多字段的模型,但我只关心 charfield。假设 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'))
但是...
这就是 groups:
{"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 的聚合函数,这就是为什么我一直有问题的原因。
如何高效地计算这些对象?我希望返回的结果类似于:
{'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'))
但是...
这就是 groups:
{"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 的聚合函数,这就是为什么我一直有问题的原因。
order_by
? - Jaradorder_by()
部分中提到的字段在选择输出数据时被使用,即使它们在values()
调用中没有被指定。这些额外的字段用于将“相似”的结果分组在一起,它们可以使本来相同的结果行看起来是不同的。这在计数时特别明显。”因此,默认排序可能会添加混乱事物的多余字段。 - mgalgs