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;
- 我试过了
extra(select={codes_len':'cardinality(codes)'})
,但是你
不能在 extra
字段上 annotate
或 aggregate
。
- 我试过
annotate(Sum("cardinality('codes')"))
,但是
cardinality('codes')
不是模型上的字段。
- 我调查了编写一个自定义聚合字段,该字段结合了
Sum
和 cardinality
,但看起来……很脆弱。
- 我在文档中发现
__len
在
ArrayField
,但不在上下文中
annotate(Sum('codes__len'))
.
- 我排除了原始 SQL 因为有很多
WHERE
语句(此处省略)使得此查询难以手动重建。
在这一点上,我认为我别无选择,只能向模型添加一个长度为 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'))
我有这个型号:
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)'})
,但是你 不能在extra
字段上annotate
或aggregate
。 - 我试过
annotate(Sum("cardinality('codes')"))
,但是cardinality('codes')
不是模型上的字段。 - 我调查了编写一个自定义聚合字段,该字段结合了
Sum
和cardinality
,但看起来……很脆弱。 - 我在文档中发现
__len
在ArrayField
,但不在上下文中annotate(Sum('codes__len'))
. - 我排除了原始 SQL 因为有很多
WHERE
语句(此处省略)使得此查询难以手动重建。
在这一点上,我认为我别无选择,只能向模型添加一个长度为 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'))