模型开发流程
- 配置数据库
- 定义模型类(一个模型类对应数据库中的一张表)
- 生成迁移文件(生成sql语句脚本)python manage.py makemigrations
- 执行迁移文件(生成数据库表)python manage.py migrate
- 使用模型进行增删改查操作
ORM(关系对象映射)
核心思想:解耦合,将业务逻辑和SQL进行解耦
可以理解为翻译机,翻译成不同的语言
定义模型
- 数据库中的数据类型
字符串:char,varchar,text,longText,set等
数字:int,tinyint,double,float
时间:date,year等 - 不同的数据类型内存分配不一样
其他
- 用于设置元信息
class Meta:
db_table = 'userss' # 表名
ordering = ['id'] # 通过id升序排列 - 通过对模型对象(objects)来实现对模型的查询
两种常用的过滤器,可以连续使用
(1)filter:过滤满足条件的数据
(2)exclude:过滤不满足条件的数据(不包含)
(3)all():返回所有数据
(4)order_by():排序,默认根据id排序,如果要倒序,使用order_by("-id")
(5)values():一条数据就是一个json,返回一个列表
(6)get():查询结果没有或者超过1个,都会抛异常
(7)first()/last():可能会出现第一个和最后一个是同一个对象(解决方法:先排序在查找)
(8)count():查询集合的数量
(9)exists():结果集合是否有数据
(10)切片:左闭右开,querySet[1:4], 如:Users.userObj.all()[1:5]
查询后的结果不是列表,是结果集合
查询集表示从数据库获取的对象集合
不管查询多少次,都不会真正去查询数据库,只有在获取结果集中的属性才会去查询数据库
查询条件
pk:主键
gt:大于
lt:小于
gte:大于等于
lte:小于等于
=
in
contains
startwith/endwith
前面同时添加i(ignore)如icontains/istartwith
备注:
django查询条件有时区问题,解决方法:
关闭自定义市区(settings中USE_TZ = False)
(11)aggregate(max(属性))
aggregate(count(xx))
aggregate(avg(xx))
3、模型成员
显性属性:开发写的
隐形属性:
ORM自动生成
如果把隐形属性声明了,系统不会产生隐形属性
如:a_m = models.Manager(),作用=objects
当一个方法重复写了几次,可以考虑封装
- 方法
对象方法:可以调用对象的属性,也可以调用类的属性
a. 方法参数中第一个是self
b. 通过self调用类中的属性
c. 支持对象调用对象方法,不支持类名调用对象方法
类方法:可以调用类的属性,不能调用对象的属性
a. 用@classmethod装饰
b. 类方法中传入一个类名(cls)
c. 通过类名调用类中的属性cls.xxx
d. 支持对象来调用类方法,也支持类名调用类方法
e. 类方法对类属性进行的处理是有记忆性的
*静态方法:都不能调用,不能获取对象属性,也不能获取类的属性,只是寄生在类中
a.用@staticmethod装饰
b.静态方法无法调用属性值,所以不会对类中的方法进行操作
c.如果一个方法跟类里面的属性没有任何关联时使用静态方法
d.支持对象和类名调用静态方法