zoukankan      html  css  js  c++  java
  • 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 = []
  • 相关阅读:
    python : 将txt文件中的数据读为numpy数组或列表
    ROS :为IDE配置环境变量
    ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin
    ROS 教程之 vision : 用各种摄像头获取图像
    ROS 教程之 network:多台计算机之间网络通信(2)
    MS sql 查询动态表名的方法
    把ocx打包成CAB,并签名
    DataSet 转换成List
    C# 反序列化datetime的处理
    PSP软件开发过程管理
  • 原文地址:https://www.cnblogs.com/huningfei/p/9605853.html
Copyright © 2011-2022 走看看