#######################################################################
# PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET #
#######################################################################

  1. def all(self)
  2. # 获取所有的数据对象
  3.  
  4. def filter(self, *args, **kwargs)
  5. # 条件查询
  6. # 条件可以是:参数,字典,Q
  7.  
  8. def exclude(self, *args,**kwargs)
  9. #条件查询
  10. #条件可以是:参数, 字典, Q
  11.  
  12. def select_related(self,*fields)
        性能相关:表之间进行join连表操作,一次性获取关联的数据
        model.tb.objects.all().select_related()
        model.tb.objects.all().select_related("外键字段")
        model.tb.objects.all().select_related("外键字段__外键字段")
  13.  
  14. def prefetch_related(self,*lookups)
        性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作.
            #获取所有用户表
            #获取用户类型表where id in (用户表中的查到的所有用户ID)
            models.UserInfo.objects.prefetch_related("外键字段")
            
            from django.db.models import Count, Case, When, IntegerField
            Article.objects.annotate(
                  numviews = Count(Case(
                        When(readership__what_time__lt=treshold, then=1),
                        output_field = CharField(),
                 ))
            )
            students = Student.objects.all().annotate(num_excused_absences=models.Sum(
                models.Case(
                  models.When(absence__type='Excused', then = 1),
                default=0,
                output_field = models.IntegerField()
            )))
    def annotate(self,*args,**kwargs)
        #用于实现聚合group by查询
        
        from django.db.models import Count,Avg,Max,Min,Sum
        
        v = models.UserInfo.objects.values('u_id').annotate(uid = Count('u_id'))
        #SELECT u_id, COUNT(ui) AS 'uid' FROM UserInfo GROUP BY u_id
  15.  
  16.     v = models.UserInfo.objects.values('u_id').annotate(uid = Count('u_id')).filter(uid__gt=1)
        #SELECT u_id, COUNT(ui_id) AS 'uid' FROM UserInfo GROUP BY u_id having count(u_id)>1
  17.  
  18.     v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct = True)).filter(uid__gt=1)
        #SELECT u_id, COUNT(DISTINCT ui_id) AS 'uid' FROM UserInfo GROUP BY u_id having count(u_id) >1
        
    def distinct(self,*field_names)
        #用于distinct去重
        models.UserInfo.objects.values('nid').distinct()
        #select distinct nid from userinfo
  19.  
  20.     注: 只有在PostgreSQL中才能使用distinct进行去重
  21.  
  22. def order_by(self,*field_names)
        #用于排序
        models.UserInfo.objects.all().order_by('-id','age')
  23.  
  24. def extra(self,select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
        #构造额外的查询条件或者映射,如:子查询
        UserInfo.objects.extra(where=['headline ? %s'],params=['Lennon'])
        #select * from userinfo where headline > 'Lennon'
  25.  
  26.     UserInfo.objects.extra(where=["foo='a' OR bar = 'a'","baz='a'"])
        #select * from userinfo where (foo='a' OR bar = 'a') and baz='a'
  27.  
  28.     UserInfo.objects.extra(select={'new_id':"select col from sometable where othercol > %s"}, select_params=(1,))
            """
            select
                id,
                name,
                (select col from sometable where othercol > 1) as new_id
            """
  29.  
  30.     UserInfo.objects.extra(select = {'new_id':"select id from tb where id > %s "},select_params=(1,),order_by=['-nid'])
  31.  
  32. def reverse(self)
        #倒序
        models.UserInfo.objects.all().order_by('-nid').reverse()
        #注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序
  33.  
  34. def defer(self,*fields)
        models.UserInfo.objects.defer('username','id')
        
        models.UserInfo.objects.filter(...).defer('username','id')
        #映射中排除某列数据
  35.  
  36. def only(self,*fields):
        #仅取某个表中的数据
        models.UserInfo.objects.only('username','id')
        
        models.UserInfo.objects.filter(...).only('username','id')
  37.  
  38. def using(self,alias)
        指定使用的数据库,参数为别名(setting中的设置)
        models.UserInfo.objects.filter(id=5).using('db1')
  1.             ##################################################
  2. # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
  3. ##################################################
  4.  
  5. def raw(self, raw_query, params=None, translations=None, using=None):
  6. # 执行原生SQL
  7. models.UserInfo.objects.raw('select * from userinfo where id > 10 ')
  8.  
  9. # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
  10. models.UserInfo.objects.raw('select id as nid from 其他表')
  11.  
  12. # 为原生SQL设置参数
  13. models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
  14.  
  15. # 将获取的到列名转换为指定列名
  16. name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
  17. Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
  18.  
  19. # 指定数据库
  20. models.UserInfo.objects.raw('select * from userinfo', using="default")
  21.  
  22. ################### 原生SQL ###################
  23. from django.db import connection, connections
  24. cursor = connection.cursor() # cursor = connections['default'].cursor()
  25. cursor.execute("""SELECT * from auth_user where id = %s""", [1])
  26. row = cursor.fetchone() # fetchall()/fetchmany(..)
  27.  
  28. def values(self, *fields):
  29. # 获取每行数据为字典格式
  30.  
  31. def values_list(self, *fields, **kwargs):
  32. # 获取每行数据为元祖
  33.  
  34. def dates(self, field_name, kind, order='ASC'):
  35. # 根据时间进行某一部分进行去重查找并截取指定内容
  36. # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
  37. # order只能是:"ASC" "DESC"
  38. # 并获取转换后的时间
  39. - year : 年-01-01
  40. - month: 年-月-01
  41. - day : 年-月-日
  42.  
  43. models.DatePlus.objects.dates('ctime','day','DESC')
  44.  
  45. def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
  46. # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
  47. # kind只能是 "year", "month", "day", "hour", "minute", "second"
  48. # order只能是:"ASC" "DESC"
  49. # tzinfo时区对象
  50. models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
  51. models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
  52.  
  53. """
  54. pip3 install pytz
  55. import pytz
  56. pytz.all_timezones
  57. pytz.timezone(‘Asia/Shanghai’)
  58. """
  59.  
  60. def none(self):
  61. # 空QuerySet对象
  62.  
  63. ####################################
  64. # METHODS THAT DO DATABASE QUERIES #
  65. ####################################
  66.  
  67. def aggregate(self, *args, **kwargs):
  68. # 聚合函数,获取字典类型聚合结果
  69. from django.db.models import Count, Avg, Max, Min, Sum
  70. result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
  71. ===> {'k': 3, 'n': 4}
  72.  
  73. def count(self):
  74. # 获取个数
  75.  
  76. def get(self, *args, **kwargs):
  77. # 获取单个对象
  78.  
  79. def create(self, **kwargs):
  80. # 创建对象
  81.  
  82. def bulk_create(self, objs, batch_size=None):
  83. # 批量插入
  84. # batch_size表示一次插入的个数
  85. objs = [
  86. models.DDD(name='r11'),
  87. models.DDD(name='r22')
  88. ]
  89. models.DDD.objects.bulk_create(objs, 10)
  90.  
  91. def get_or_create(self, defaults=None, **kwargs):
  92. # 如果存在,则获取,否则,创建
  93. # defaults 指定创建时,其他字段的值
  94. obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '','u_id': 2, 't_id': 2})
  95.  
  96. def update_or_create(self, defaults=None, **kwargs):
  97. # 如果存在,则更新,否则,创建
  98. # defaults 指定创建时或更新时的其他字段
  99. obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '','u_id': 2, 't_id': 1})
  100.  
  101. def first(self):
  102. # 获取第一个
  103.  
  104. def last(self):
  105. # 获取最后一个
  106.  
  107. def in_bulk(self, id_list=None):
  108. # 根据主键ID进行查找
  109. id_list = [11,21,31]
  110. models.DDD.objects.in_bulk(id_list)
  111.  
  112. models.User.objects.filter(id__in=[11,21,31])
  113.  
  114. def delete(self):
  115. # 删除
  116.  
  117. def update(self, **kwargs):
  118. # 更新
  119.  
  120. def exists(self):
  121. # 是否有结果
  122. pass

图片版

所有ORM操作 (第二版)的更多相关文章

  1. Vim/Vi常用操作(第二版)

    周围同事不是用vim就是Emacs,你要是用一ultraedit,你都不好意思跟人家打招呼;什么插件呀,语法高亮呀,拼写检查呀,能给它开的都给它开着,就是一个字儿:酷. 你说这么牛B一东西,怎么着学会 ...

  2. Python核心编程(第二版)PDF

    Python核心编程(第二版) 目录 第1部分 Python核心第1章 欢迎来到Python世界1.1 什么是Python1.2 起源1.3 特点1.3.1 高级1.3.2 面向对象1.3.3 可升级 ...

  3. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  4. 《selenium2 Java 自动化测试实战(第二版)》 更新2016.5.3

    java 版来了!! 本文档在<selenium2 Python 自动化测试实战>的基础上,将代码与实例替换为java ,当然,部分章节有变更.这主要更语言本身的特点有关.集合和java下 ...

  5. J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册)

    J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册) 之前那一版本(http://www.cnblogs.com/rojas/p/4794684.html)没考虑 DLL 注 ...

  6. 分布式文件系统MFS(moosefs)实现存储共享(第二版)

    分布式文件系统MFS(moosefs)实现存储共享(第二版) 作者:田逸(sery@163.com) 由于用户数量的不断攀升,我对访问量大的应用实现了可扩展.高可靠的集群部署(即lvs+keepali ...

  7. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  8. 简单的web三层架构系统【第二版】

    昨天写了 web三层架构的第一版,准确的说是三层架构的前期,顶多算是个二层架构,要慢慢完善. 第一版里,程序虽说能运行起来,但是有一个缺陷,就是里面的SQL语句,是使用的拼接字符进行执行.这样安全系数 ...

  9. JavaScript 多级联动浮动(下拉)菜单 (第二版)

    JavaScript 多级联动浮动(下拉)菜单 (第二版)   上一个版本(第一版请看这里)基本实现了多级联动和浮动菜单的功能,但效果不是太好,使用麻烦还有些bug,实用性不高.这次除了修改已发现的问 ...

随机推荐

  1. Hadoop — HDFS的概念、原理及基本操作

    1. HDFS的基本概念和特性 设计思想——分而治之:将大文件.大批量文件分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析.在大数据系统中作用:为各类分布式运算框架(如:map ...

  2. retry示例

    #!/usr/bin/python2.7 # -*- coding: utf-8 -*- import time import exceptions def func(): # a,b = None ...

  3. WCF各个Service之间共享数据

    为了实现cache存储验证用户身份信息,减少通过数据库验证的次数,需要在wcf各个服务之间建立共享数据区. namespace WcfService1 {     public static clas ...

  4. 【十四】jvm 性能调优实例

    实例1: POI Excel 导出 Excel对象很大,多人同时登录系统导出Excel的话,就会有多个大Excel对象到老年代,这是老年代需要回收,系统可能会卡顿. jvm堆内存设置的越大,Full ...

  5. termios结构体的内容

    一.结构体成员 struct termios { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_ ...

  6. 利用PHP+MySql+Ajax操作实现年月日联动功能

    PHP+MySql+Ajax实现年月日的三级联动 <!DOCTYPE html><html>    <head>        <meta charset=& ...

  7. Dapper.net 输出存储过程实例

    1.存储过程名: public static class CampaignTrackingDomainSql { /// <summary> /// proc /// </summa ...

  8. Linux pmap 工具

    pmap 用来查看当前进程占用内存使用详细 pmap 格式: -x, --extended # 显示扩展的信息 -d, --device # 显示设备的信息 -q, --quiet # 不显示头或脚注 ...

  9. Linux之增加系统调用[内核编译]

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 由于操作系统实验的缘故,有一个实验需要 ...

  10. 第28月第11天 vim -b

    1. 首先以二进制方式编辑这个文件:        vim -b datafile现在用 xxd 把这个文件转换成十六进制:        :%!xxd文本看起来像这样:        0000000 ...