Django查询来计算ArrayFields的长度

2024-05-14 03:02:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个型号:

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

我正在尝试如何在Django中执行与此SQL查询相同的操作:

^{pr2}$
  • 我试过extra(select={codes_len':'cardinality(codes)'}),但是你 不能annotateaggregate覆盖extra字段。在
  • 我试过annotate(Sum("cardinality('codes')")),但是 cardinality('codes')不是模型上的字段。在
  • 我研究了如何编写一个结合Sum的自定义聚合字段 还有cardinality,但看起来。。。易碎。在
  • 我在文档中发现__lenArrayField,但不是在 annotate(Sum('codes__len'))。在
  • 我排除了原始SQL,因为有很多WHERE语句(这里省略),这些语句使得手工重建这个查询很困难。在

在这一点上,我想我别无选择,只能在模型中添加一个codes字段的长度,并用save()来保持它的同步。在

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


Tags: 模型sqlmodellenmodels语句extracodes
1条回答
网友
1楼 · 发布于 2024-05-14 03:02:34

结果是自定义聚合函数才是最好的选择!在

包括以下内容:

from django.db.models import Aggregate

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

查询非常简单:

^{pr2}$

相关问题 更多 >