定义属性
概述
·django根据属性的类型确定以下信息
·当前选择的数据库支持字段的类型
·渲染管理表单时使用的默认html控件
·在管理站点最低限度的验证
django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
·属性命名限制
·遵循标识符规则
·由于django的查询方式,不允许使用连续的下划线
库
·定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中
·使用方式
·导入from django.db import models
·通过models.Field创建字段类型的对象,赋值给属性
逻辑删除
·对于重要数据都做逻辑删除,不做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False
字段类型
·AutoField
·一个根据实际ID自动增长的IntegerField,通常不指定如果不指定,一个主键字段将自动添加到模型中
·CharField(max_length=字符长度)
·字符串,默认的表单样式是 TextInput
·TextField
·大文本字段,一般超过4000使用,默认的表单控件是Textarea
·IntegerField
·整数
·DecimalField(max_digits=None, decimal_places=None)
·使用python的Decimal实例表示的十进制浮点数
·参数说明
·DecimalField.max_digits
·位数总数
·DecimalField.decimal_places
·小数点后的数字位数
·FloatField
·用Python的float实例来表示的浮点数
·BooleanField
·true/false 字段,此字段的默认表单控制是CheckboxInput
·NullBooleanField
·支持null、true、false三种值
·DateField([auto_now=False, auto_now_add=False])
·使用Python的datetime.date实例表示的日期
·参数说明
·DateField.auto_now
·每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
·DateField.auto_now_add
·当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
·说明
·该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
·注意
·auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
·TimeField
·使用Python的datetime.time实例表示的时间,参数同DateField
·DateTimeField
·使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
·FileField
·一个上传文件的字段
·ImageField
·继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
字段选项
·概述
·通过字段选项,可以实现对字段的约束
·在字段对象时通过关键字参数指定
·null
·如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
·blanke
·如果为True,则该字段允许为空白,默认值是 False
·注意
·null是数据库范畴的概念,blank是表单验证证范畴的
·db_column
·字段的名称,如果未指定,则使用属性的名称
·db_index
·若值为 True, 则在表中会为此字段创建索引
·default
·默认值
·primary_key
·若为 True, 则该字段会成为模型的主键字段
·unique
·如果为 True, 这个字段在表中必须有唯一值
关系
·分类
·ForeignKey:一对多,将字段定义在多的端中
·ManyToManyField:多对多,将字段定义在两端中
·OneToOneField:一对一,将字段定义在任意一端中
·用一访问多
·格式
·对象.模型类小写_set
·示例
grade.students_set
·用一访问一
·格式
·对象.模型类小写
·示例
·grade.students
·访问id
·格式
·对象.属性_id
·示例
·student.sgrade_id
创建模型类
元选项:
说明:在模型类中定义Meta类,用于设置元信息
有两个属性:
db_table ----- 定义数据表名,(表名,默认为应用名.类名)
ordering ---- 对象的默认排序字段(获取对象的列表时使用)
ordering[字段] ---升
ordering[-字段] ---降
模型成员
类属性(objects)--也可以叫做管理器
是Manager类型的一个对象,作用是与数据库存进行交互
当定义模型类时,没有指定管理器,则Django则为模型创建名为objects的管理器
例:Students.objects.all() ---访问所有数据
自定义模型管理器(即是创建了一个Manager对象)
models.py中
当自定义后,则默认的objects就不存在了
自定义管理器Manager类(models.py中)
模型管理器是Django的模型进行与数据库交互的接口,一个模型可以有多个模型管理器
作用:
1、向管时哭喊中添加额外的方法
2、修改管理器返回的原始查询集
例如:重写里面的方法:get_querset()方法
这样就可以自定义查询的数据结果了
Students.stuObj.all()
创建对象(views.py中用于添加数据)
目的: 用于向数据库中添加数据
当创建对象时,Django不会对数据库进行读写操作,当调用save()方法时,才与数据库交互,将对象保存到数据库中。
注意:__init__方法已经在父类models.Model中使用,在自定义的模型中无法使用(即不能写__inint__)
创建对象方法:
1,在模型类中增加类方法
2,在自定义管理器添加一个方法
方式一(models.py增加类方法):
然后:
http://localhost:8000/addstudents/ -------浏览器中执行(添加学生)
http://localhost:8000/students/ ---浏览器中执行(查看学生)
方式二(自定义管理器类添加个方法)
urls.py 中新增:
views.py中新增对应的视图类:
models.py中自定义管理器类(添加代码):
http://localhost:8000/students2/ --- 添加对象
http://localhost:8000/students/ --- 查看
模型查询
概念:
查询集:从数据库中获取的对象的集合。
查询集可以多个过滤器
过滤器就是一个函数。基于这个函数中的参数,去限制查询的范围条件
查询集 == select * from xxx
过滤器 === where 子句
1,可以在管理器中调用方法,
可以写成链式调用,即多个过滤器
惰性执行:
创建查询集不会有产生任何数据的访问,只有调用时,才会有访问
直接访问数据的情况也是有的(非惰性):
一种是迭代,
另一种是序列化
再一种是与if合用
返回查询集
返回查询集的方法称为过滤器:
all() --- 返回查询集中的所有数据,返回的是对象
filter() -- 返回符合条件的数据(以下都是且的关系)
filter(键=值)
filter(键=值,键=值)
filter(键=值).filter(键=值)
exculde() -- 过滤掉符合条件的数据
values() --- 一条数据就是一个对象(字典样式),返回一个列表(多个对象)
返回单个数据:
get() --- 返回一个满足条件的对象,
注意:
如果没有找到符合条件的对象,则会引发模型类DoesNotExist异常
如果找到多个对象,也会引发模型类MultipleObjectsReturned异常
count()
first()
last()
exists()
限制查询集:
--返回的也是列表,可以使用下标的方法进行限制,等同于MYSQL中的limit() 和ORACLE中的rownum
例1:显示前5个学生
例2:分页显示,每页显示5个
查询集的缓存:
概述:
每个查询集都包含一个缓存,来最小化的对数据库访问。
在新建的查询集中缓存首次为空。第一次以查询集求值(就是访问数据),会发生数据的缓存。Django会将查询出来的数据做缓存,并返回查询结果。以后的查询则直接使用查询集的缓存。
字段的查询(即方法filter(),exclude(),get()的参数)
概述:实现了SQL语句中的where 语句,
字段查询,即是以上方法的参数
语法:
属性名称__比较运算符=值 注意:是双下划线
外键查询的语法:
属性名_id 注意:是单下划线
转义:
类似于SQL语句中的like语句。即模糊查询
比较运算符查询
exact 用于判断,大小写敏感 例:filter(isDelete=False)
contains 就否包含,相当于SQL中like,大小写敏感
startswith, endswith 以value开头或者结尾,大小写敏感,
说明:
以上4个在前面加上i就表示不区分大小写
isnull isnotnull 是否为空 例:filter(sname__isnull=False) #名字不为空的
in 是否在范围内 例:filter(pk_in=[2,4,6,8,10])
gt 大于
gte 大于等于
lt 小于
lte 小于等于
例如:
转义
contaions 不需转义,“= ” 号后面是什么符号就匹配什么符号
而SQL中的like(‘%’) 如果要匹配%这样的特殊字符,就必须转义
跨关联查询
处理join查询
语法:
模型类名__属性名__比较运算符 (比较运算符是可以没有的)
注意:
因为要获取的是班级信息,所以写法是 Grades.objects.filter(xxxx)
然后是外关联条件
查询快捷
pk 代表主键,
聚合函数(最大值,最小值。。)
使用aggregate()函数返回聚合函数的值
Avg
Count
Max
Min
Sum
例:以最大值为例Max()
F对象
1,可以使用模型的A属性和B属进行比较 (一条数据里的两个字段比较)
2,支持F对象的算术运算(也可以时间加减。。)
Q对象
需求:进行or查询 (解决或的查询, 非的查询)
说明:
当时有一个Q时,有没有Q效果是一样的,
例如 studentslist=Students.stuObj.filter(Q(pk__lt=3) )
可以取反,如下截图:
日期查询
year
month
day
week_day
hour
minute
second