- 使用聚合查询
常用的聚合语法:
aggregate
annotate
values (虽然这个可能不算,但用的很多)
Count
Sum
aggregate() 是 QuerySet 的一个终端子句,使用后将返回“名称-值”的字典,其中“名称”就是聚合值的标志,“值”就是计算出的聚合结果。“名称”是根据字段名和聚合函数而自动生成的。如果你想指定一个聚合值的名称,你可以在指定聚合子句的时候提供指定的名称:
Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}
与 aggregate() 不同的是,annotate() 不是终端子句。annotate() 子句的输出就是 QuerySet;这个 QuerySet 被其他 QuerySet 操作进行修改,包括 filter()`, order_by() ,甚至可以对 annotate() 进行额外调用。
q = Book.objects.annotate(Count('authors'), Count('store'))
q[0].authors__count ====>6
q[0].store__count ====>6
参考链接:
https://docs.djangoproject.com/zh-hans/3.2/topics/db/aggregation/
https://zhuanlan.zhihu.com/p/504359795
- Django model中数据批量导入bulk_create()
#!/usr/bin/env python
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
def main():
from blog.models import Blog
f = open('oldblog.txt')
BlogList = []
for line in f:
parts = line.split('****')
BlogList.append(Blog(title=parts[0], content=parts[1]))
f.close()
# 以上四行 也可以用 列表解析 写成下面这样
# BlogList = [Blog(title=line.split('****')[0], content=line.split('****')[1]) for line in f]
Blog.objects.bulk_create(BlogList)
if __name__ == "__main__":
main()
print('Done!')
PS:
- 由于Blog.objects.create()每保存一条就执行一次SQL,而bulk_create()是执行一条SQL存入多条数据,做会快很多!当然用列表解析代替 for 循环会更快!!
- django.db.models 中还有一个函数叫 get_or_create(),之前文章中也提到过,有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有
参考链接:
https://www.cnblogs.com/ccorz/p/Django-model-zhong-shu-ju-pi-liang-dao-rubulkcreat.html
- 响应数据量太大问题,可以给接口加个gzip压缩
MIDDLEWARE = [
'django.middleware.gzip.GZipMiddleware',
]
ps:安全研究人员最近透露,当在网站上使用压缩技术(包括 GZipMiddleware)时,该网站可能会面临多种可能的攻击。