问题描述:

使用Django的ORM建立了如下Model:

class Book(models.Model):
name = models.CharField(max_length=300)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
authors = models.CharField(max_length=300)
publisher = models.CharField(max_length300)
pub_date = models.DateField()

现在想查询以字段authors分组,查出每个作者所著所有书的总页书,用SQL语句可以很容易的完成此任务:

SELECT *, SUM(pages) AS total_pages
FROM Book
GROUP BY authors;

那么如何用Django自带的ORM接口实现呢?

from django.db.models import Sum

result = Book.objects.values("authors").annotate(total_pages=Sum("pages")).all()

注意事项:

如果你在定义Book模型时指定的默认的排序字段,如下:

class Book(models.Model):

    ...同上...

    class Meta:
ordering = ["name"]

那么,上述result的查询语句会得到错误的结果, 其所执行的SQL语句如下:

SELECT *, SUM(pages) AS total_pages
FROM Book
GROUP BY authors, name
ORDER BY name;

也就是说默认的排序字段(在这里是name)也会自动加入到GROUP BY子句中. 要避免这样的情况,只需在查询时清空默认的order by排序条件即可:

from django.db.models import Sum

result = Book.objects.values("authors").annotate(total_pages=Sum("pages")).order_by()

ps:你可以通过以下方法查看查询集的对应SQL语句

raw_sql = result.query
print(raw_sql)

或者安装django-extensions插件,然后使用python manage.py shell_plus --print-sql命令进入Shell,在此Shell中你通过Django对数据库执行的所有操作都会自动打印出其对应的SQL语句.

除了上述方法,还有另外一种:

book_list = Book.objects.all()
book_list.query.group_by = ['authors']

作者:给我二两面

链接:https://www.jianshu.com/p/9ac4ca98b8e4

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最新文章

  1. OpenSceneGraph控制模型
  2. Ubuntu14.10下安装JDK 8
  3. MSSQL MERGE语法
  4. python——argsort函数
  5. swift 集合类型(二)
  6. 补间动画TweenAnimation
  7. HDU 4686 Arc of Dream(矩阵)
  8. ECSHOP在线手册布局参考图--登录/注册页 user_passport.dwt
  9. Asp.Net 之 当前上下文中不存在名称" Server "
  10. 一种解决的方法:CGContextSaveGState: invalid context 0x0
  11. hdu 5073 Galaxy(2014acm鞍山亚洲分部 D)
  12. Python-Django 模型层-单表查询
  13. (后端)SpringBoot中Mybatis打印sql(转)
  14. 【PS技巧】如何拼图
  15. jeffy-vim-v3.1.tar.gz
  16. Linux 下MQ的安装和配置亲测
  17. HashSet的底层
  18. hdu 4370 0 or 1,最短路
  19. 13 python logging模块
  20. windows7环境下使用pip安装MySQLdb

热门文章

  1. csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」
  2. IDEA拷贝类路径
  3. 写DockerFile的一些技巧
  4. PyCharm 2020.1 激活教程
  5. css文字动画(自动换文字)
  6. buu SCTF Who is he
  7. easyswoole实现线上更新代码
  8. Windows 上连接蓝牙耳机
  9. linux学习之路第三天
  10. 密码学系列之:memory-bound函数