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

def all(self)
# 获取所有的数据对象 def filter(self, *args, **kwargs)
# 条件查询
# 条件可以是:参数,字典,Q def exclude(self, *args,**kwargs)
#条件查询
#条件可以是:参数, 字典, Q def select_related(self,*fields)
    性能相关:表之间进行join连表操作,一次性获取关联的数据
    model.tb.objects.all().select_related()
    model.tb.objects.all().select_related("外键字段")
    model.tb.objects.all().select_related("外键字段__外键字段") 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     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     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     注: 只有在PostgreSQL中才能使用distinct进行去重 def order_by(self,*field_names)
    #用于排序
    models.UserInfo.objects.all().order_by('-id','age') 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'     UserInfo.objects.extra(where=["foo='a' OR bar = 'a'","baz='a'"])
    #select * from userinfo where (foo='a' OR bar = 'a') and baz='a'     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
        """     UserInfo.objects.extra(select = {'new_id':"select id from tb where id > %s "},select_params=(1,),order_by=['-nid']) def reverse(self)
    #倒序
    models.UserInfo.objects.all().order_by('-nid').reverse()
    #注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序 def defer(self,*fields)
    models.UserInfo.objects.defer('username','id')
    或
    models.UserInfo.objects.filter(...).defer('username','id')
    #映射中排除某列数据 def only(self,*fields):
    #仅取某个表中的数据
    models.UserInfo.objects.only('username','id')
    或
    models.UserInfo.objects.filter(...).only('username','id') def using(self,alias)
    指定使用的数据库,参数为别名(setting中的设置)
    models.UserInfo.objects.filter(id=5).using('db1')
            ##################################################
# PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
################################################## def raw(self, raw_query, params=None, translations=None, using=None):
# 执行原生SQL
models.UserInfo.objects.raw('select * from userinfo where id > 10 ') # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
models.UserInfo.objects.raw('select id as nid from 其他表') # 为原生SQL设置参数
models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,]) # 将获取的到列名转换为指定列名
name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table', translations=name_map) # 指定数据库
models.UserInfo.objects.raw('select * from userinfo', using="default") ################### 原生SQL ###################
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone() # fetchall()/fetchmany(..) def values(self, *fields):
# 获取每行数据为字典格式 def values_list(self, *fields, **kwargs):
# 获取每行数据为元祖 def dates(self, field_name, kind, order='ASC'):
# 根据时间进行某一部分进行去重查找并截取指定内容
# kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
# order只能是:"ASC" "DESC"
# 并获取转换后的时间
- year : 年-01-01
- month: 年-月-01
- day : 年-月-日 models.DatePlus.objects.dates('ctime','day','DESC') def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
# 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
# kind只能是 "year", "month", "day", "hour", "minute", "second"
# order只能是:"ASC" "DESC"
# tzinfo时区对象
models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai')) """
pip3 install pytz
import pytz
pytz.all_timezones
pytz.timezone(‘Asia/Shanghai’)
""" def none(self):
# 空QuerySet对象 ####################################
# METHODS THAT DO DATABASE QUERIES #
#################################### def aggregate(self, *args, **kwargs):
# 聚合函数,获取字典类型聚合结果
from django.db.models import Count, Avg, Max, Min, Sum
result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
===> {'k': 3, 'n': 4} def count(self):
# 获取个数 def get(self, *args, **kwargs):
# 获取单个对象 def create(self, **kwargs):
# 创建对象 def bulk_create(self, objs, batch_size=None):
# 批量插入
# batch_size表示一次插入的个数
objs = [
models.DDD(name='r11'),
models.DDD(name='r22')
]
models.DDD.objects.bulk_create(objs, 10) def get_or_create(self, defaults=None, **kwargs):
# 如果存在,则获取,否则,创建
# defaults 指定创建时,其他字段的值
obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '','u_id': 2, 't_id': 2}) def update_or_create(self, defaults=None, **kwargs):
# 如果存在,则更新,否则,创建
# defaults 指定创建时或更新时的其他字段
obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '','u_id': 2, 't_id': 1}) def first(self):
# 获取第一个 def last(self):
# 获取最后一个 def in_bulk(self, id_list=None):
# 根据主键ID进行查找
id_list = [11,21,31]
models.DDD.objects.in_bulk(id_list) models.User.objects.filter(id__in=[11,21,31]) def delete(self):
# 删除 def update(self, **kwargs):
# 更新 def exists(self):
# 是否有结果
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. 生成表结构数据库文档sql语句

    CREATE PROCEDURE [dbo].[生成表结构数据库文档]ASBEGIN -- SET NOCOUNT ON added to prevent extra result sets from ...

  2. Vertica系列:性能优化

    Vertica 性能非常好, 平时基本不会碰到性能问题, 即使碰到, 优化也很容易, 而且效果往往会很好. ======================优化工具==================== ...

  3. UTF8 UTF16 之间的互相转换

    首先需要知道 Unicode 编码范围 [U+00, U+10FFFF], 其中 [U+00, U+FFFF] 称为基础平面(BMP), 这其中的字符最为常用. 当然, 这 65536 个字符是远远不 ...

  4. Javaweb学习笔记——(十四)—————— 服务器端验证注册登入表单项目

    项目:https://download.csdn.net/download/qq_40223688/10463436 项目 功能: *注册 *登录--------------------------- ...

  5. 四、文件IO——内核数据结构和原子操作

    4.1 缓存 buff 说明 一般设置缓存 buff  的大小是由一定的规律的,就是根据磁盘块的大小来定. Linux下输入命令: df -k  查看磁盘 可以用命令查看下 /dev/sda1 磁盘的 ...

  6. Java SE之XML<一>XML文档规约

    [文档整理系列] Java SE之XML<一>XML文档规约 1.xml文档引用: 1.外部私有DTD: <!DOCTYPE rootNodeName SYSTEM "ur ...

  7. Hbase思维导图之逻辑结构

  8. C++ 类使用多线程技术

    参考文章 : http://blog.csdn.net/jmh1996/article/details/72235232 成员函数作为线程函数,  要将成员函数定义为静态的 C++ 静态成员函数调用非 ...

  9. java Object类的公共方法

    1.HashCode();      2. wait();  3. notify(); 4.equals(); 5.getClass(); 6.toString(); 7.clone(); 8.fin ...

  10. 添加日志(配置spring)---Java_web

    一.配置日志--以下三部 1.配置web.xml;  2.配置 log4j.properties;  3.配置jar包 以下是文件目录 二.配置 web.xml (注意:下面的classpath即lo ...