Django查询的条件注释

2024-04-18 17:58:58 发布

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

我有一个模型,看起来像下面这样:

class MyStat(Model):
     metric = ForeignKey(MetricType) 
     source = ForeingKey(SourceType)

     total_units = IntegerField()
     metric_units = IntegerField()

     objects = MyQuerySet().as_manager()

查询在其代码中执行以下操作

rollup = self.order_by().values(source.name)\.
                 annotate(mu=Sum('metric_units'), tu=Sum('total_units'))

这很有效。但是,我想修改一些依赖于所使用的metric类型的注释。不知何故,创建一个数据库端条件,它的注释会略有不同(下面的伪代码):

if metric is some_metric:
      .annotate(mu=.8*Sum('metric_units'))
else:
      .annotate(mu=Sum('metric_units'))

显然上面的语法是无效的,但是我想知道是否有一种方法可以设置我的queryset在数据库端执行类似的操作


Tags: 代码模型数据库sourcemodelmetricclasstotal
1条回答
网友
1楼 · 发布于 2024-04-18 17:58:58

可以使用^{}进行条件表达式。你知道吗

让我们转到注释部分。你知道吗

免责声明:此代码未经测试

from django.db.models import Case, Value, When, FloatField, Sum

...annotate(mu=Case(When(metric=some_metric, then=Value(.8*Sum('metric_units')),
                    default=Value(Sum('metric_units')),
                    output_field=FloatField())))

如果需要与列表中的多个值进行匹配,可以创建When对象列表:

whens = []
for some_metric in some_metrics:
    whens.append(When(metric=some_metric, then=Value(some-value-here)))

...annotate(mu=Case(*whens, default=Value(Sum('metric_units')),
                            output_field=FloatField()))

相关问题 更多 >