首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django .aggregate()在.annotate()

Django .aggregate()在.annotate()
EN

Stack Overflow用户
提问于 2015-06-22 16:05:07
回答 2查看 9.5K关注 0票数 11

是否可以聚合查询集的注释?

模型:

代码语言:javascript
复制
class Article(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()

class State(models.Model):
    article = Models.ForeignKey(Article)
    date = DateField()
    views = IntegerField()
    downloads = IntegerField()

我想做以下几件事:

代码语言:javascript
复制
articles = metrics_models.Article.objects.filter(
    state__date__month=month,
    state__date__year=year
).annotate(
    views=Min('state__views'),
    downloads=Min('state__downloads')
).aggregate(
    views=Sum('views'),
    downloads=Sum('downloads')
)

错误:

代码语言:javascript
复制
Exception Type: DatabaseError
Exception Value:    
column "downloads" does not exist
LINE 1: SELECT SUM(downloads), SUM(views) FROM (SELECT "metrics_arti...

在运行这个程序时,我得到一个DatabaseError,因为django试图对'views‘和'download’数据库列进行聚合,而不是对注释进行聚合。

还有其他方法可以在QuerySet注释上进行这种聚合吗?

EN

回答 2

Stack Overflow用户

发布于 2015-07-14 10:22:16

我认为medmunds是对的,您不能重复使用相同的名称作为注释和聚合别名。这就是你想要做的,我想:

代码语言:javascript
复制
articles = metrics_models.Article.objects.filter(
    state__date__month=month,
    state__date__year=year
).annotate(
    min_views=Min('state__views'),
    min_downloads=Min('state__downloads')
).aggregate(
    sum_min_views=Sum('min_views'),
    sum_min_downloads=Sum('min_downloads')
)
票数 9
EN

Stack Overflow用户

发布于 2022-07-25 11:51:57

根据您最初的查询,我认为这是可行的。

代码语言:javascript
复制
from django.db.models import ExpressionWrapper, Min, OuterRef

articles = (
    Article.objects.filter(state__date__month=month, state__date__year=year)
    .annotate(
        views=ExpressionWrapper(
            Min(
                State.objects.filter(article_id=OuterRef("id")).values_list(
                    "views", flat=True
                )
            ),
            output_field=models.IntegerField(),
        ),
        downloads=ExpressionWrapper(
            Min(
                State.objects.filter(article_id=OuterRef("id")).values_list(
                    "downloads", flat=True
                )
            ),
            output_field=models.IntegerField(),
        ),
    )
    .aggregate(views=Sum("views"), downloads=Sum("downloads"))
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30984711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档