ORM框架
- Object:对象-类
- Relation:关系,关系数据中的表
- Mapping:映射
通过类和对象操作对应的数据表,不需要写sql语句
Django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作
设计类:模型类
ORM另外一个作用:根据设计的类生成数据库中的表
模型类设计
在应用models.py中设计模型类
必须继承于models.Model类
模型类生成表
1)生成迁移文件
python manage.py makemigrations
2)执行迁移生成表
python manage.py migrate
定义属性
Django根据属性的类型确定以下信息:
当前选择的数据库支持字段的类型
渲染管理表单时使用的默认html控件
在管理站点最低限度的验证
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列
注意:pk是主键的别名,若主键名为id2,那么pk是id2的别名
属性命名限制:
不可以使用pyhon关键字
不许连续使用_
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:属性名=models.字段类型(选项)
字段类型:
使用时需要引入django.db.models包,字段类型如下:
AutoField 自动增长的IntegerField,不用指定,会自动创建属性名为id的自动增长属性
BooleanField 布尔字段,值为True或False
NullBooleanField 支持Null、True、False三种值
CharField(max_length=最大值)字符串,参数max_length表示最大字符个数 必须添加
TextField 大文本字段,超过4000字符的时候使用
IntegerField 整数
DecimalField(max_digits=None, decimal_places=None) 十进制浮点数,参数max_digits表示总位数,参数decimal_places表示小数的位数
FloatField 浮点数,参数同上 但是不稳定 一般取精确值的时候不用FloatField
DateField(auto_now=False/auto_now_add=False) 第一个参数表示最后一次修改的时间 第二个参数表示创建的时间 两者互斥不可以同时使用
TimeField 时间,参数同DateField
DateTimeField 日期时间,参数同DateField
FileField 上传文件字段 upload_to 上传路径
ImageField 继承于FileField对上传的内容进行校验,确保是有效的图片
通过选项实现对字段的约束,选项如下:
default 设置默认值
primary_key 若为True,则该字段会成为模型的主键字段,默认是False,一般作为AutoField的选项使用
unique 如果为True,这个字段在表中必须是唯一的,默认是False
db_index 若值为True,则在表中会为此字段创建索引,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
null 若为True,表示允许为空,默认值是False
blank 若为True,则该字段允许为空白,默认值是False
注意:null是数据库范畴的概念,blank是后台管理页面表单验证范畴的
接下来让我们尝试着练一段shell命令:
进入项目shell的命令:
pyhton manage.py shell
导入图书类
from booktest.models import BookInfo
创建实例对象
b = BookInfo()
添加书名
b.btitle = "天龙八部"
导入时间函数
from datetime import date
添加出版时间
b.bpub_date = date(19901,1)
保存
b.save()
获取图书类信息
b2 = BookInfo.objects.get(id=1)
查看类型
type(b2)
>>><class 'booktest.models.BookInfo'>
获取书名
b2.btitle
获取出版时间
b2.bpub_date
获取id
b2.id
修改出版时间
b2.bpuv_date=date(1990,10,10)
保存
b2.save()
删除指定信息
b2.delete()
查询和图书相关联的信息
对象名.对应的多类对象的信息_set.all(),返回一个列表
b.heroinfo_set.all()
查询和多类相关的一类的信息
对象名.hbook.一类的属性
查询图书表里面的所有内容
BookInfo.objects.all()
HeroInfo.objects.all()