Django - 聚合模型中字段的相等值

Django - Aggregate equal values of fields in model

我有 activity 用户活动日志,基本结构如下:

class ActivityLog(TimeStampedModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    action_type = models.CharField(max_length=25)
    object_raw = models.CharField(max_length=500)

我想汇总 object_raw 匹配的所有条目,也就是说,如果用户在 4 个不同的场合搜索 'foo',我会返回 'foo' 的一个条目,其中计数=4。我现在很难做到这一点。我知道如何在 sql 中执行此操作,但不了解 django 语法。我一直在阅读文档,但我仍然不明白。如果有人能提供帮助,将不胜感激!

要获得一个 'foo' 的对象以及有多少对象 object_raw='foo' 你可以这样做:

activity_logs = ActivityLog.objects.filter(object_raw='foo')
if activity_logs.exists():
    activity_logs.first()  # get one object
    activity_logs.count()  # get number of objects

如果你只想知道有多少对象有object_raw='foo',你可以使用conditional expressions with aggregates:

from django.db.models import IntegerField, Sum
Client.objects.aggregate(
    num_object_raw=Sum(
        Case(
            When(object_raw='foo', then=1),
            output_field=IntegerField()
        )
    )
)