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关键字及双下划线
字段类型:
html

字段类型 类型含义 描述
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,对上传的内容进行校验,确保是有效的图片



字段选项(即数据表中字段限制):
python

选项 默认值 描述 是否要从新迁移修改表结构
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中的方法:
mysql

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条件:
git

条件 含义 注释
exact 判等 能够省略
contains; endswith; startswith 模糊查询 包含; 以什么开头; 结尾
isnull 空查询 是否为空,是返回True,否返回False
in 范围查询 在....内
gt,lt,gte,lte 比较查询 大于,小于,大于等于,小于等于
year, date 日期查询 年,日期



查询的其余方式
sql

方法 做用 示例
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语句
shell

打开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
数据库

相关文章
相关标签/搜索