20-2 orm分组和聚合以及在项目中执行的一些方法
一 orm分组和聚合
参考:https://www.cnblogs.com/liwenzhou/p/8660826.html
1 表结构:
# 第一张表 class Employee1(models.Model): name = models.CharField(max_length=12) age = models.IntegerField() salary = models.IntegerField() dept = models.CharField(max_length=12) #下面两张表互相关联 class Dept(models.Model): name = models.CharField(max_length=12) class Employee2(models.Model): name = models.CharField(max_length=12) age = models.IntegerField() salary = models.IntegerField() dept = models.ForeignKey(to="Dept")
#查询所有 # ret = models.Employee1.objects.all() # select * from employee1; # print(ret) # ret = models.Employee1.objects.values() # [{}, {}] # values可以指定title查询 # ret = models.Employee1.objects.values("dept") # select dept from employee1; #分组聚合查询,在一张表里面 annotate是分组 from django.db.models import Avg, Max, Min, Count, Sum # ret = models.Employee1.objects.values("dept").annotate(avg_salary=Avg("salary")).values("dept", "avg_salary") # 垮表查询 ret = models.Employee2.objects.values("dept_id").annotate(avg_salary=Avg("salary")).values("dept__name", "avg_salary")
annotate()
annotate()前面查的是什么就按照什么分组
.values("dept").annotate()就表示按照dept分组
二 . 时间格式化函数
1. MySQL
DATE_FORMAT(字段, '格式')
2. sqlite
strftime('格式', 字段)
例子:
# 拿到一个日期归档的数据 archive_list = models.FaultReport.objects.all().extra( # select={"ym": "date_format(create_time, '%%Y-%%m')"} # MySQL日期格式化的写法 select={"ym": "strftime('%%Y-%%m', create_time)"} # sqlite数据库日期格式化的写法 ).values("ym").annotate(num=Count("id")).values("ym", "num")
# 解释,查询所有的故障,并且按故障的创建时间去分组统计一共有多少故障,id指的是faultreport这个故障表里的id
Django ORM执行原生SQL语句, 使用extra()执行部分sql语句
三 二级路由
urls配置:
#使用之前先导入你的二级路由
from fault_reporting import urls as fault_report_urls # 二级路由
# 故障总结主页面 url(r'^fault-report/', include(fault_report_urls)), # 以fault-report开头的所有路由都交给二级路由去处理
二级路由urls配置:
from django.conf.urls import url from fault_reporting import views urlpatterns = [ # 第一版, 特别low版 # url('^lob/(.*)/$', views.lob), # url('^tag/(.*)/$', views.tag), # url('^archive/(.*)/$', views.archive), # # # 第二版: 三合一 # url(r'(lob|tag|archive)/(.*)/$', views.sanhe1), # sanhe1(request, *args) args[0]=="lob" # 第三版: 四合一 url(r'(lob|tag|archive)/(.*)/$', views.index), # index(request, "lob", "游戏") ]
views配置:
report_list = models.FaultReport.objects.all() # 如果有参数,并且参数长度是2 if args and len(args) == 2: # 进入细分查询 if args[0] == "lob": # 按业务线查询, report_list = report_list.filter(lob__title=args[1]) #args[1]指的是视频等业务 elif args[0] == "tag": # 是按照标签查询 report_list = report_list.filter(tags__title=args[1]) else: # 按照日期(年月)来查询 try: year, month = args[1].split("-") #以“——”分割取出年和月, report_list = report_list.filter(create_time__year=year, create_time__month=month)#按照创建时间取出内容 except Exception: report_list = []