1. from teatcher.models import Student      导入app(teatcher)下的模型(Student)
  2.  
  3. In [11]: res = Student.objects.all().query
  4.  
  5. In [12]: print(res)
  6. SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`sex`, `teatcher_student`.`age`, `teatcher_student`.`qq`, `teatcher_student`.`phone`, `teatcher_student`.`c_time`, `teatcher_student`.`m_time` FROM `teatcher_student`
  7.  
  8. # Student.ojbects.all() 和select * from Student 效果一样. 返回是object

1.常用的模型字段类型


https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types

2.字段的常用参数
官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-options

  1. id = models.IntegerField(primary_key=True) # 主键
    mame = models.CharField(max_length=50,unique=True) # unqiue 唯一
    num = models.CharField('班级编号203班,102班',max_length=20, unique=True) 备注,最大长度,唯一
  1. qq = models.CharField(max_length=20, default='') # 字符类型
    phone = models.CharField(max_length=30,default='')
    c_time = models.DateTimeField('创建时间', auto_now_add=True) # auto_now_add 只加一次
    m_time = models.DateTimeField('修改时间', auto_now=True) # auto_now 每次修改 会更新

3.常用查询*****
通过模型类上的管理器来构造QuerySet。
- 模型类上的管理器是啥?
**模型类.objects:

如:     Student.objects    object 是 Student 实例的管理器

- QuerySet 表示数据库中对象的集合。
等同于select 语句。 惰性的
案例:

- first() 获取第一条 返回的是对象
- last() 获取最后一条 返回的也是一个对象

  1. In [12]: Student.objects.first()
  2. Out[12]: <Student: 啊呆-18> #返回对象
  3.  
  4. In [13]: Student.objects.last()
  5. Out[13]: <Student: 小红-21>

In [20]: res = Student.objects.last()

In [21]: print(res)

小红-21

In [22]: res .qq
Out[22]: '28456'

In [23]: print(res)
小红-21

思考:排序规则? 默认通过主键。通过_meta 设置
- get(**kwargs) 根据给定的条件,获取一个对象,如果有多个对象符合,保存

  1. Student.objects.get(id=1) #get 和 主键配合,, get(pk=1) ,获取到多条结果时,会报错.
  2. Out[29]: <Student: 啊呆-18>

- all() 获取所有记录 返回的是queryset

- filter(**kwargs) 根据给定的条件,获取一个过滤后的queryset,多个条件使用and连接。

  1. In [32]: Student.objects.filter(age=18)
  2. Out[32]: <QuerySet [<Student: 啊呆-18>, <Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>]>
  3.  
  4. In [33]: Student.objects.filter(age=18,sex=1) 多个条件','分割
  5. Out[33]: <QuerySet [<Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>]>

In [35]: res = Student.objects.filter(age=18,sex=1)   #返回 对象集

In [36]: res[0].name
Out[36]: '小张'

- exclude(**kwargs) 跟filter使用方法一致,作用想反,它是排除。

  1. # exclude 不包含的意思.不包含 age=18,sex=1的
  2. In [38]: res = Student.objects.exclude(age=18,sex=1)
  3.  
  4. In [39]: print(res)
  5. <QuerySet [<Student: 啊呆-18>, <Student: 小绿-19>, <Student: 小红-21>]>
  6.  
  7. In [45]:print(res.query)   

In [45]:SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`sex`, `teatcher_student`.`age`, `teatcher_student`.`qq`, `teatcher_student`.`phone`, `teatcher_student`.`c_time`, `teatcher_student`.`m_time` FROM `teatcher_student` WHERE NOT (`teatcher_student`.`age` = 18 AND `teatcher_student`.`sex` = 1)

- 多条件的OR连接 用到Q对象,django.db.models.Q

  1. In [41]: from django.db.models import Q
  2.  
  3. Student.objects.filter(Q(age=0)|Q(age=18))'

<QuerySet [<Student: 啊呆-18>, <Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>]>

QuerySet[0].name 取值 ,<><表示是一个对象>

- values(*fields) 返回一个queryset,返回一个字典列表,而不是数据对象。

  1. In [50]: Student.objects.values('name')
  2. Out[50]: <QuerySet [{'name': '啊呆'}, {'name': '小张'}, {'name': '小黄'}, {'name': '小兰'}, {'name': '小绿'}, {'name': '小红'}]>

In [54]: print(res.query)
SELECT `teatcher_student`.`name` FROM `teatcher_student`

  1.  
  1. In [51]: Student.objects.values('name','sex')
  2. Out[51]: <QuerySet [{'name': '啊呆', 'sex': 0}, {'name': '小张', 'sex': 1}, {'name': '小黄', 'sex': 1}, {'name': '小兰', 'sex': 1}, {'name': '小绿', 'sex': 0}, {'name':x': 0}]>
  1.  

- only(*fiels) 返回querySet ,对象列表,注意only一定包含主键字段

  1. In [55]: res =Student.objects.only('name')
  2.  
  3. In [58]: print(res.query)
  4. SELECT `teatcher_student`.`id`, `teatcher_student`.`name` FROM `teatcher_student`
  5.  
  6. In [59]: print(res)
  7. <QuerySet [<Student: 啊呆-18>, <Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>, <Student: 小绿-19>, <Student: 小红-21>]>

- defer(*fields) 返回一个QuerySet,作用和only相反

不包含 *fidelfs  的记录

  1. In [60]: res =Student.objects.defer('name')
  2.  
  3. In [61]: print(res.query)
  4. SELECT `teatcher_student`.`id`, `teatcher_student`.`sex`, `teatcher_student`.`age`, `teatcher_student`.`qq`, `teatcher_student`.`phone`, `teatcher_student`.`c_time`, `teatcher_student`.`m_time` FROM `teatcher_student`
  5.  
  6. In [62]: print(res)
  7. <QuerySet [<Student: 啊呆-18>, <Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>, <Student: 小绿-19>, <Student: 小红-21>]>

- order_by(*fields) 根据给定的字段来排序 默认是顺序,字段名前加上 ‘-’代表反序
- 切片 和python的列表切片用法相似,不支持负索引,数据量大时不用步长
*** 切片过后,不再支持,附加过滤条件与排序

  1. In [63]: res =Student.objects.defer('name').order_by('name')
  2.  
  3. In [64]: print(res)
  4. <QuerySet [<Student: 啊呆-18>, <Student: 小兰-18>, <Student: 小张-18>, <Student: 小红-21>, <Student: 小绿-19>, <Student: 小黄-18>]>
  5.  
  6. In [65]: print(res.query)
  7. SELECT `teatcher_student`.`id`, `teatcher_student`.`sex`, `teatcher_student`.`age`, `teatcher_student`.`qq`, `teatcher_student`.`phone`, `teatcher_student`.`c_time`, `teatcher_student`.`m_time` FROM `teatcher_student` ORDER BY `teatcher_student`.`name` ASC
  1. 查询结果 切片
    In [9]: Student.objects.all()
  2. Out[9]: <QuerySet [<Student: 啊呆-18>, <Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>, <Student: 小绿-19>, <Student: 小红-21>]>
  3.  
  4. In [10]: Student.objects.all()[2:4] # 查询返回结果中的第三到第四条
  5. Out[10]: <QuerySet [<Student: 小黄-18>, <Student: 小兰-18>]>

print(Student.objects.all()[2:4].query)
SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`sex`, `teatcher_student`.`age`, `teatcher_student`.`qq`, `teatcher_student`.`phone`, `teatcher_student`.`c_time`, `teatcher_student`.`m_time` FROM `teatcher_student` LIMIT 2 OFFSET 2

- 常用查询条件 filter,exclude, get
- exact

  1. (字段名__exact=19) 等同 (字段=19)
  2. Student.objects.get(age__exact=19)
  3. Out[15]: <Student: 小绿-19>

- iexact

  1. In [21]: Student.objects.create(name='zhuoDa') # 字段=xXXXx i 表示 忽略大小写
  2. Out[21]: <Student: zhuoDa-0>
  3.  
  4. In [22]: Student.objects.only('name').filter(name__iexact='zhuoda')
  5. Out[22]: <QuerySet [<Student: zhuoda-0>, <Student: Zhuoda-0>, <Student: ZhuoDa-0>, <Student: zhuoDa-0>]>

  

- contains
- icontains

  1. - contains # 包含 like %xxx%
  2. - icontains# 忽略大小写的 包含 like %xxx%
  1. BINARY 关键字,区分大小写
  1. In [25]: print(Student.objects.only('name').filter(name__contains='da').query)
  2. SELECT `teatcher_student`.`id`, `teatcher_student`.`name` FROM `teatcher_student` WHERE `teatcher_student`.`name` LIKE BINARY %da%
  3.  
  4. In [26]: print(Student.objects.only('name').filter(name__icontains='da').query)
  5. SELECT `teatcher_student`.`id`, `teatcher_student`.`name` FROM `teatcher_student` WHERE `teatcher_student`.`name` LIKE %da%

- in

  1. In [34]: Student.objects.only('name').filter(name__in=['小张','小黄']) # (name__in=[1,2,3,4,5])
  2. Out[34]: <QuerySet [<Student: 小张-18>, <Student: 小黄-18>]>

- range

  1. In [36]: Student.objects.only('name').filter(age__range=(5,50)) # range(小,大) 只能 从小 到大 写.
  2. Out[36]: <QuerySet [<Student: 啊呆-18>, <Student: 小张-18>, <Student: 小黄-18>, <Student: 小兰-18>, <Student: 小绿-19>, <Student: 小红-21>]>

In [37]: print(Student.objects.only('name','age').filter(age__range=(5,50)).query)
SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`age` FROM `teatcher_student` WHERE `teatcher_student`.`age` BETWEEN 5 AND 50

- gt
- gte
- lt
- lte

  1. In [38]: print(Student.objects.only('name','age').filter(age__gt=5).query)
  2. SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`age` FROM `teatcher_student` WHERE `teatcher_student`.`age` > 5

- startswith    #  什么开头的
- istartswith  #  什么 开头 忽略大小写
- endswith  #  什么结尾的
- iendswith  #  什么 结尾 忽略大小写

  1. In [39]: print(Student.objects.only('name','age').filter(name__startswith='z').query)
  2. SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`age` FROM `teatcher_student` WHERE `teatcher_student`.`name` LIKE BINARY z%
  3.  
  4. In [40]: print(Student.objects.only('name','age').filter(name__istartswith='z').query)
  5. SELECT `teatcher_student`.`id`, `teatcher_student`.`name`, `teatcher_student`.`age` FROM `teatcher_student` WHERE `teatcher_student`.`name` LIKE z%

  

- isnull True False 对应 IS NULL IS NOT NULL
- 聚合
from django.db.models import Count, Avg, Max, Min, Sum
通过queryset的aggregate方法
Student.objects.aggregate(age_avg=Avg('age')) # 计算平均年龄
- count
- 平均值 Avg
- 分组,聚合
结合 Values,annotate 和聚合方法一起实现

  1. In [42]: from django.db.models import Count,Avg,Max,Min,Sum
  2. In [44]: Student.objects.aggregate(age_avg=Avg('age')) #(临时字段名= Avg('字段'))
  3. Out[44]: {'age_avg': 11.2}
  4.  
  5. In [46]: Student.objects.aggregate(ages=Min('age'))
  6. Out[46]: {'ages': 0}
  7.  
  8. In [47]: Student.objects.aggregate(ages=Max('age'))
  9. Out[47]: {'ages': 21}
  10.  
  11. In [48]: Student.objects.aggregate(ages=Count('age'))
  12. Out[48]: {'ages': 10}

查询男生有几个,女生有几个

  1. In [49]: Student.objects.values('sex').annotate(num=Count('sex'))
  2. Out[49]: <QuerySet [{'sex': 0, 'num': 7}, {'sex': 1, 'num': 3}]>
  3.  
  4. In [50]: print(Student.objects.values('sex').annotate(num=Count('sex')).query)
  5. SELECT `teatcher_student`.`sex`, COUNT(`teatcher_student`.`sex`) AS `num` FROM `teatcher_student` GROUP BY `teatcher_student`.`sex` ORDER BY NULL

****按字段的小写 排序

关键字:Lower

  1. In [6]: from django.db.models.functions import Lower
  2.  
  3. In [7]: student.objects.all()
  4. Out[7]:^[[A^[[A<QuerySet [<student: 第一条-18>, <student: 第二条-18>, <student: 第三条-22>, <student: 第四条-18>]>
  5.  
  6. In [8]: student.objects.order_by(Lower('name'))
  7. Out[8]: <QuerySet [<student: 第一条-18>, <student: 第三条-22>, <student: 第二条-18>, <student: 第四条-18>]>
  8.  
  9. In [9]: print(student.objects.order_by(Lower('name')).query)
  10. SELECT `student_student`.`id`, `student_student`.`name`, `student_student`.`sex`, `student_student`.`age`, `student_student`.`qq`, `student_student`.`phone`, `student_student`.`c_time` FROM `student_student` ORDER BY LOWER(`student_student`.`name`) ASC

非数值类型的倒序

  1. In [12]: student.objects.order_by(Lower('name').desc())
  2. Out[12]: <QuerySet [<student: 第四条-18>, <student: 第二条-18>, <student: 第三条-22>, <student: 第一条-18>]>

In [13]: print(student.objects.order_by(Lower('name').desc()).query)
SELECT `student_student`.`id`, `student_student`.`name`, `student_student`.`sex`, `student_student`.`age`, `student_student`.`qq`, `student_student`.`phone`, `student_student`.`c_time` FROM `student_student` ORDER BY LOWER(`student_student`.`name`) DESC

4.表关系实现

Django 的ORM 数据操作的更多相关文章

  1. Django【第5篇】:Django之ORM数据库操作

    django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...

  2. Django models ORM基础操作--白话聊Django系列

    上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...

  3. Django之ORM表操作

    ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...

  4. Django框架(八) Django之ORM数据库操作

    创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...

  5. Django框架----ORM数据库操作

    一.ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用 ...

  6. Django之ORM数据查询方式练习

    单表查询 单表查询简单示例 # 字段 models.DateField(auto_now_add) models.DateField(auto_now) # auto_now 和auto_now_ad ...

  7. django之ORM数据库操作

    一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...

  8. Django之ORM相关操作

    一般操作 常用的13个操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(** ...

  9. Django之ORM查询操作详解

    浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Python脚本中调用Django环境 其他操 ...

随机推荐

  1. 深入学习Motan系列(五)—— 序列化与编码协议

    一.序列化 1.什么是序列化和反序列化? 序列化:将对象变成有序的字节流,里面保存了对象的状态和相关描述信息. 反序列化:将有序的字节流恢复成对象. 一句话来说,就是对象的保存与恢复. 为什么需要这个 ...

  2. [Java] Thread -- 避免Race Condition (Synchronized)

    public class TestRaceCondition implements Runnable{ public static int counter = 0; public static voi ...

  3. Linux之cd、pwd、mkdir、rmdir

    cd.pwd.mkdir.rmdir 命令功能: 切换到指定的目录,可用绝对路径和相对路径 命令格式: cd directory 命令参数: 无 命令实例: 1.切换到/bin目录 vbird@Ubu ...

  4. unity的一些tips

    主要是我知乎上回答的一个关于unity的tip,备忘. 说说我所看到unity相关的,不好的习惯: 1 尽量不要在Awake(), start()等函数内加入业务逻辑的初始化代码.首先无法简便的直接启 ...

  5. 右击菜单一键优化(增加新建office2003、新建reg和bat,删除新建公文包、新建wps、新建rar)

    右击菜单一键优化(增加新建office2003.新建reg和bat,删除新建公文包.新建wps.新建rar) Windows Registry Editor Version 5.00 [HKEY_CL ...

  6. The 'INFORMATION_SCHEMA.GLOBAL_STATUS' feature is disabled; see the documentation for 'show_compatibility_56'

    --从mysql5.7.6开始information_schema.global_status已经开始被舍弃,为了兼容性,此时需要打开 show_compatibility_56 mysql> ...

  7. MySQL 之 MHA + ProxySQL + keepalived 实现读写分离,高可用(二)

    ProxySQL安装 yum/rpm安装 在github或官网上可以下载rpm包,wiki的Getting start章节有详细介绍. cat <<EOF | tee /etc/yum.r ...

  8. 涂抹mysql笔记-数据备份和恢复

    <>物理备份和逻辑备份<>联机备份和脱机备份<>本地备份和远程备份<>完整备份和增量备份<>完整恢复和增量恢复<>复制表相关文件 ...

  9. 查看Linux内置命令和外部命令

    1. [hl@localhost ~]$ which cd /bin/cd [hl@localhost ~]$ type cd cd is a shell builtin

  10. ADB文件及文件夹操作

    1.创建文件夹: adb shell mkdir /data/local/tmp/local多级的一次只能创建一级adb shell mkdir /data/local/tmp/local/tmp 2 ...