Django 查询对 ArrayFields 的长度求和

Django query to Sum the lengths of ArrayFields

我有这个型号:

class Interaction(models.Model):
    user = models.ForeignKey(User)
    codes = ArrayField(models.CharField(choices=CODE_CHOICES))

我正在尝试弄清楚如何在 Django 中执行与此 SQL 查询等效的操作:

select user_id, sum(cardinality(codes)) from interaction group by user_id;

在这一点上,我认为我别无选择,只能向模型添加一个长度为 codes 字段的字段,并与 save() 保持同步。

真的没有别的办法了吗?我错过了什么吗?

事实证明,自定义聚合函数才是王道!

具有以下内容:

from django.db.models import Aggregate

class SumCardinality(Aggregate):
    template = 'SUM(CARDINALITY(%(expressions)s))'

查询很简单:

Interaction.objects().filter(xxx).\
    values('user_id').annotate(codes_len=SumCardinality('codes'))