Django ORM基础篇【转载】
ORM( Object relational mapping 对象关系映射)
D:把面向对象中的类和数据库表一一对应起来,在django项目与数据库之间起着桥梁的
角色
E:通过操作类和对象,对数据库表实现数据的增删改查等操作,而不需要写SQL语句
使用ORM可以通过方便的配置,切换使用不同的数据库
U:①使用django进行数据库开发步骤:
1. 在models.py中定义模型类(生成表名为应用名_模型类名小写)
2. 生成迁移文件: python manage.D呃py makemigrations
3. 执行迁移生成数据库表(默认使用sqlite3数据库,生成的数据库名为:db.sqlite3): python manage.py migrate
4. 安装sqliteman:sudo apt-get install sqliteman;启动:sqliteman
5. 通过模型类和对象,对数据进行增删改查
通过ORM对数据库增删改:
可以进入交互模式执行代码:python manage.py shell
创建模型类对象:a = 模型类()
增/改:a.save() --------不指定id则默认使用上一次id,第一次为1,如果指定id,id不存
在则添加数据,id存在则修改数据,如id =None,则id=上一次id+1
删除:a.delete() --------不指定id即删除本次id
字段属性(即数据表中对应的字段):
属性名 = models.字段类型(字段限制) ------属性名不可以用python关键字及双下划线
字段类型:
| 字段类型 | 类型含义 | 描述 |
| AutoField | 自动增长的整数字段 | 通常不需要指定,Django会自动创建属性名为id的自动增长属性 |
| BooleanField | 布尔字段 | 值为True或False |
| NullBooleanField | 空布尔字段 | 支持Null、True、False三种值。 |
| CharField | 字符串字段 | 必须指定参数(max_length=字符个数) |
| TextField | 大文本字段 | 一般超过4000个字符时使用 |
| DateField,TimeField,DateTimeField | 日期, 时间, 日期时间字段 | 可指定参数auto_now=False(True:保存对象,django自动为该属性赋值,默认为False);auto_now_add(True:第一次创建,django自动为该属性赋值,默认为False) |
| IntegerField | 整数字段 | 从 -2147483648 到 2147483647 范围内的值是合法的 |
| DecimalField | 十进制浮点数 | 必须指定参数(max_digit=总位数,decimal_places=小数后位数) |
| FloatField | 浮点数 | 用python中的float来表示,有误差 |
| FileField | 上传文件字段 | |
| ImageField | 图片字段 | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
字段选项(即数据表中字段限制):
| 选项 | 默认值 | 描述 | 是否要重新迁移修改表结构 |
| null | False | True:数据库中字段允许为空 | 是 |
| unique | False | True:值必须唯一 | 是 |
| db_column | 属性名称 | 字段名,如果未指定,则使用属性的名称 | 是 |
| db_index | False | True:为此字段创建索引。 查看索引:show index from 表名 | 是 |
| primary_key | False | True:则该字段会成为模型的主键字段,一般作为AutoField的选项使用 | 是 |
| default | 为字段设置默认值 | 否 | |
| blank | False | True:html页面表单验证时字段允许为空 | 否 |
通过ORM查询数据库:
objects(模型管理器)
D:每个模型类都有一个objects的类属性,由django字段生成
E:查询数据库的数据或对数据进行操作处理
U:objects中的方法:
| objects管理器中的方法 | 返回类型 | 作用 |
| 模型类.objects.get() | 模型对象 | 返回一个对象,且只能有一个: 如果查到多条数据,则报:MultipleObjectsReturned 如果查询不到数据,则报:DoesNotExist |
| 模型类.objects.filter() | QuerySet | 返回满足条件的对象 |
| 模型类.objects.all() | QuerySet | 返回所有的对象 |
| 模型类.objects.exclude() | QuerySet | 返回不满条件的对象 |
| 模型类.objects.order_by() | QuerySet | 对查询结果集进行排序 |
| 模型类.objects.aggregate() | 字典,例如:{'salary__avg': 9500.0} | 进行聚合操作 Sum, Count, Max, Min, Avg |
| 模型类.objects.count() | 数字 | 返回查询集中对象的数目 |
filter方法
D:模型管理器objects的一种查询方法
E:实现条件查询,返回QuerySet对象,包含了所满足条件的数据
U:模型类.objects.filter(模型类属性名__条件名 = 值)
filter条件:
| 条件 | 含义 | 注释 |
| exact | 判等 | 可以省略 |
| contains; endswith; startswith | 模糊查询 | 包含; 以什么开头; 结尾 |
| isnull | 空查询 | 是否为空,是返回True,否返回False |
| in | 范围查询 | 在....内 |
| gt,lt,gte,lte | 比较查询 | 大于,小于,大于等于,小于等于 |
| year, date | 日期查询 | 年,日期 |
查询的其他方式
| 方法 | 作用 | 示例 |
| F对象 | 引用某字段的值,对比表中的两个字段 | 查询语文分数大于数学分数的学生 成绩表.objects.filter(语文__gt=F('数学')) |
| Q对象 | 组合多个查询条件,通过(&,|,~)进行逻辑操作 | Q(条件1)逻辑操作符 Q(条件2) |
| order_by | 对查询结果进行排序(默认升序) | 升序: 模型类.objects.order_by('字段名') 降序: 模型类.objects.order_by('-字段名') |
| aggregate | 聚合操作,对多行查询结果中的一列进行操作,返回一个值。(有Sum,Count,Max,Min,Avg) | 模型类.objects.aggregate(聚合类('模型属性')) 返回值是一个字典,格式: {'属性名__聚合函数': 值} |
| count | 统计满足条件的对象的个数,返回值是一个数字 | 模型类.objects.count() |
查看orm语句
| 打开mysqld.cnf | sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf |
| 重启mysql服务 | sudo service mysql restart |
| 查看mysql日志内容 | sudo tail -f /var/log/mysql/mysql.log |
QuerySet查询集
D:调用模型管理器的all, filter, exclude, order_by方法会产生一个QuerySet
E:先过滤得到该查询集还可以调用objects的方法操作数据
U:①取下标操作(下标不允许负数):b[0]取出QuerySet的第一条数据,如果不存在则
抛异常
②切片操作(下标不允许负数):产生新的QuerySet
③get():取出QuerySet的唯一一条数据,不存在或者多条则抛异常
④exsit():判断是否有数据
⑤改,删数据库数据:QuerySet对象.update(属性1=值1),QuerySet.delete()
特性:①惰性查询:只有在使用QuerySet中的数据时,才会取查询数据库中的数据
②缓存:第一次遍历QuerySet中的所有对象,django会把数据缓存起来,第二次再使用时会使
用缓存,不会再次查询。
一对多关联查询
由一类的条件查询多类数据
1. 一类对象 = 一类类名.objects.get(条件)
一类对象.多类类名小写_set.all()
2. 多类类名.objects.filter(一类类名小写__一类属性名__条件 = 值)
由多类的条件查询一类数据
1. 多类对象 = 多类类名.objects.get(条件)
多类对象.关联属性
2. 一类类名.objects.filter(多类类名小写__多类属性名__条件 =值 )
自关联
D:是一种特殊的一对多关系
U:自关联关联属性定义:关联属性 = models.ForeignKey('self')
自定义模型管理器
D:在模型类中自定义模型管理器,自定义后,Django将不再生成默认的objects
E: 功能1:修改管理器返回的原始查询集
功能2:在管理器类中添加额外的方法,帮助我们操作模型类对应的数据表,减轻视
图函数中的代码量,主要做逻辑处理。
U:①在views创建一个自定义模型管理器类,继承Manager
②重写父类的方法修改管理器返回的原始查询集
③把操作数据库的代码实现封装到模型管理器的方法中,返回模型类对象
④在原模型类中:objects=自定义模型管理器类名() 实现功能1
⑤在视图函数中调用objects.③的方法名() 可实现功能2
Django ORM基础篇【转载】的更多相关文章
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- 【Python之路】第二十二篇--Django【基础篇】
1 Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...
- Django 【基础篇】
前戏 python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #cod ...
- django ORM教程(转载)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Python开发【第十八篇】Web框架之Django【基础篇】
一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...
- #阿里云#云服务器部署Django(基础篇)
前言 本人能力有限,本文只是简单介绍基础部署流程,没有过多考虑系统安全等因素,请谅解.初学者参考了解,大神勿喷. 纯测试部署,采用阿里云ECS,系统Ubuntu 16.04 64位,部署采用nginx ...
- Django【基础篇】
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Python之Django【基础篇】
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Python自动化开发 - Django【基础篇】
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为: 大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能 ...
随机推荐
- 封装QtCore(在非Qt项目里使用QString,QJson,QFileInfo,QFile等类)
单独封装QtCore 一直以来使用QT的特性使用惯了,很多东西QT都封装得很好.如果突然有一天,不使用QT开发了,是不是不习惯. 比如我们经常使用QString很多方法,string,wstring之 ...
- twemproxy分片处理原理--剖析twemproxy代码正编
twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的 ...
- A熟知SP.NET---WebForms UnobtrusiveValidationMode 必须“jquery”ScriptResourceMapping。
我相信,有过ASP.NET人们学习经验RequiredFieldValidator控制(验证非空控制)一定不会陌生,禁止控制输入定义的内容的作用(该属性InitialValue的值.属性默认值为空字符 ...
- BZOJ 1483 HNOI2009 梦幻布丁 名单+启示录式的合并
标题效果:特定n布丁.每个人都有一个颜色布丁,所有的布丁反复有一定的颜色变化的颜色,颜色反复询问的段数 数据范围:n<=10W 色彩数<=100W 启发式合并名单0.0 从来不写清楚 实际 ...
- Linux性能测试 strace命令
1 功能说明 strace 命令是一种强大的工具 , 能够显示任何由用户空间程式发出的系统调用 . strace 显示这些调用的参数并返回符号形式的值 . strace 从内核接收信息 , ...
- POJ读书笔记2.1 —— 鸡兔笼带
http://blog.csdn.net/pipisorry/article/details/36433305 问题描写叙述 一个笼子里面关了鸡和兔子(鸡有2仅仅脚.兔子有4仅仅脚.没有例外). 已 ...
- 测试WPF绑定bug
1.低级错误:有没有绑错2.去属性那里打断点,get.set有没有进3.xaml加上twoway,UpdateSourceTrigger=PropertyChanged
- 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection
问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...
- WPF ListView的使用
<Window x:Class="XamlTest.Window14" xmlns="http://schemas.microsoft.com/win ...
- js table鼠标点击时变色
<head> <title></title> <script type="text/javascript"> ...