Django的ORM如何执行group by 语句
2024-10-11 10:20:15
问题描述:
使用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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
最新文章
- OpenSceneGraph控制模型
- Ubuntu14.10下安装JDK 8
- MSSQL MERGE语法
- python——argsort函数
- swift 集合类型(二)
- 补间动画TweenAnimation
- HDU 4686 Arc of Dream(矩阵)
- ECSHOP在线手册布局参考图--登录/注册页 user_passport.dwt
- Asp.Net 之 当前上下文中不存在名称"; Server ";
- 一种解决的方法:CGContextSaveGState: invalid context 0x0
- hdu 5073 Galaxy(2014acm鞍山亚洲分部 D)
- Python-Django 模型层-单表查询
- (后端)SpringBoot中Mybatis打印sql(转)
- 【PS技巧】如何拼图
- jeffy-vim-v3.1.tar.gz
- Linux 下MQ的安装和配置亲测
- HashSet的底层
- hdu 4370 0 or 1,最短路
- 13 python logging模块
- windows7环境下使用pip安装MySQLdb