首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Querysets在.extra()之后使用.extra()

Django Querysets在.extra()之后使用.extra()
EN

Stack Overflow用户
提问于 2015-02-27 11:46:25
回答 1查看 3.6K关注 0票数 4

让我们说,我有一个非常简单的模型,像这个:

代码语言:javascript
复制
class Test(models.Model):
    category = models.CharField(unique=True)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()

基本上,我希望使用Django的ORM来获得每个类别的平均持续时间。SQL查询如下所示:

代码语言:javascript
复制
SELECT category, AVG(end_time - start_time) AS avg_duration
FROM test_table
GROUP BY category

我尝试使用以下代码,但根据docs,.annotate()中的F()表达式仅在Djano 1.8中可用。

代码语言:javascript
复制
Test.objects.values('category', 'start_time', 'end_time').annotate(avg_duration=Avg(F(end_time) - F(start_time))

我也尝试过像这样使用.extra(),但是我得到了一个FieldError。

代码语言:javascript
复制
Test.objects.extra(select={'duration':'end_time - start_time'}).values('category', 'duration').annotate(avg_duration=Avg('duration'))

从实际情况来看,第二次尝试表明注释函数不能解析列别名。真的是这样吗,还是我漏掉了什么?

此外,除了使用Django 1.8和/或使用原始SQL创建存储派生信息(每个条目的持续时间)的额外列外,您还可以推荐哪些其他选项?任何帮助都是非常感谢的。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-08-24 21:33:11

如果使用Django 1.8或更高版本,可以使用以下内容:

代码语言:javascript
复制
from django.db.models import Avg, F

Test.objects.annotate(avg_duration=Avg(F('end_time') - F('start_time')))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28764381

复制
相关文章

相似问题

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