1. models 文件
-
创建项目需要的类
#注意:继承的是 models.Model 类 class User(models.Model): name=models.CharFiled(max_length=50)
-
创建类的属性需要用Model 规定的方法创建
通过类型创建的对象来封装 管理数据,一定要在这里明确关联和对应关系程序 数据库 class 类型 table 表格 attr 属性 field 字段 object 对象 record 记录 -
有了对应关系之后,我们要创建的模型对象的属性必须和数据库中的字段类型对应起来
对象中的属性类型定义 表中的字段类型 AutoField() auto_increment 自动增长 BooleanField() bool 布尔类型 NullBooleanField() bool or null 扩展布尔类型 CharField() varchar 字符串 TextField() text 长文本 IntegerField() int 整数 DecimalField() double 高精度浮点数 FloatField() float 单进度浮点数 DateField() date 日期 TimeField() time 时间 DateTimeField() datetime 日期时间 FileField() blob 二进制 ImageField() blob 二进制 -
每个字段定义时,都会有自己的一些特殊的选项指定
选项 描述 null 如果为 True,将 NULL 空值存储到数据库中,默认 False blank 如果为 True,表示该字段允许存储空值,默认 False db_column 字段名称,如果不指定,直接使用类型属性的名称作为字段名称 db_index 如果设置为 True,表示给当前字段添加索引支持 default 给字段设置默认值 primary_key 是否设置当前字段为主键 unique 如果为 True,该字段中存储的值必须是唯一的 -
在大部分项目中,还会涉及到多表关联操作
选项 描述 ForeignKey 一对多关联关系,该字段定义在多的一方 ManyToManyField 多对多关联关系,该字段两方都需要定义 OneToOneField 一对一关联关系,该字段可以定义在任意一方 -
示例及小操作
#最大长度为10, 保留两位小数. sum = models.DecimalField(max_digits=10, decimal_places=2) #属性关联: Img 类关联 Album album = models.ForeignKey(Album, on_delete=models.CASCADE) # on_delete=models.CASCADE 含义: # img是依附album存在,当album不存在(删除),与之关联的img也不存在(删除) #对象自己的方法:管理器对象没有删除。 save() / delete()
-
可以选择引入Django 对象管理器
- 选择引入创建对象管理器文件 models_manager
#首先要在文件里创建对象管理器 UserManager ,然后导入到 models 文件 from .models_manager import UserManager #在 class 里添加对象管理器 class User(models.Model) ...... user_manager=UserManager()
- 不引入创建对象管理器文件 models_manager
#不引入创建 models_manager 的话,直接使用 models 操作 user=models.User.objects.filter(**kw).first()
- 选择引入创建对象管理器文件 models_manager
2. models_manager 文件
-
创建 models_manager 文件,创建管理器类
#注意:继承的是 models.Manager 类 class UserManager(models.Manager): #封装管理器的方法,供调用使用 def all_user(self): return self.all() ......
-
对象管理器的属性方法:
方法 作用 self.create(**kw) 创建一个对象 self.update(**kw) 更新对象的数据 self.all() 查询所有对象数据 self.get(**kw) 查询一个对象 self.filter(**kw) 查询对象列表 注意事项:
查找用户时用 get 只能查一个,查不到会报错,要用 try ... except ;而用 filter查找得到的是一个列表,当只需要一个对象数据时要在后边加first() -
查找的小方法
- order_by
#当用 filter 查找得到一个列表,当我们需要将数据按一定的规则排序时, #用 order_by (对象的属性) # 按时间顺序排列 order_by('publish'), #当用时间倒序排列时只需添加一个' - ',order_by('-publish')。 slist=models.Say.objects.filter().order_by('publish')
- _set.all
#当查找一个对象关联的所有对象,得到关联对象的列表, #用 _set.all 查找一个人的所有说说 say=models.User.objects.say_set.all
- order_by
3. 直接用对象进行数据操作:Q F
- Q----->>>对对象的复杂度查询
Q对象用法:
Q对象可以对关键字参数进行 封装,从而更好地应用多个查询.可以组合使用 and,or, not 操作符, 当一个操作符是用于两个Q对象的时候,它产生一个新的Q对象.Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面 - F----->>>专门取对象中某列值的操作
F对象的用法:
F对象允许django在未实际链接数据的情况下具有对数据库字段的值的引用.通常情况下我们在更新数据库时需要先从数据库里将原数据取出后放在内存里,然后编辑某些属性,最后提交。F 可以直接操作修改,不需要繁杂步骤。
补充
- 在命令行使用对象操作数据
#进入项目文件夹下,导入 userinfo 文件夹里 models 文件定义好的 User from userinfo.models import User #使用对象管理器,user_manager 是User 里引入的 UserManager u=User.user_manager #create_user 是 UserManager 里封装的创建对象方法 u.create_user(name='ws') ......
- 更新数据
#获取用户更改属性,并修改到数据库: # 1.先确定数据在数据库的位子: user = user_manager.get(id=u_id) # 2.获取更新后的属性 name = request.POST['name'] # 3. 更新数据 user.name=name # 4.更新数据到数据库 user.save()
- 获取三级类型的列表
#查找一个不存在的对象,获取一个空的符合格式的列表 ,储存数据。 #得出一个空的 queryset 类型 g_list = goods_manager.find_condition(gname='1') #for循环二级类型列表,获取三级类型列表,三级类型列表累加。 for type in type_list: goods_list = goods_manager.find_condition(gtype=type) g_list = goods_list | g_list