我有这个模型:
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;
- 我试过了
extra(select={codes_len':'cardinality(codes)'})
,但你不能annotate
或aggregate
超过一个extra
领域。 - 我试过了
annotate(Sum("cardinality('codes')"))
,但cardinality('codes')
不是模型上的一个字段。 - 我研究了编写一个自定义聚合字段,它结合了
Sum
和cardinality
,但看起来……很脆弱。 - 我在文档中发现
__len
确实可以在 上正常工作ArrayField
,但在annotate(Sum('codes__len'))
. - 我排除了原始 SQL,因为有很多
WHERE
语句(这里省略)使得这个查询难以手动重建。
在这一点上,我想我别无选择,只能在模型中添加一个字段长度的codes
字段并弄乱以save()
使其保持同步。
真的没有别的办法了吗?我错过了什么吗?