模型对象中有一个 objects属性,该属性是管理器 Manager类型的对象,几乎所有的方法都是通过该对象执行的。通过该方法可以进行数据库表添加数据
终端运行
python manage.py shell
在 Django 控制台可以运行模型的方法,可以做简单的数据操作
新增
简单模型
from 应用名.models import * -- 导入应用 models 下的所有模型类名.objects.create(属性='值') -- 通过 create 赋值形式给数据库字段添加数据
from 应用名.models import * -- 导入应用 models 下的所有模型实例名 = 类名(属性='值') -- 通过实例化和实例化方法添加数据实例名.save()
一对一
from 应用名.models import * -- 导入应用 models 下的所有模型类名A.objects.create(属性='值') -- 通过实例化和实例化方法添加数据实例名a = 类名A.objects.get(pk=1) -- 通过主键查询赋值给实例对象类名B.objects.create(属性=a) -- 将实例赋值给 一对一的主键字段即可完成赋值
一对一赋值必须先添加好被关联的数据,再通过主键查询获取值,赋值给设置了主键的字段进行关联
一对多
类名A.objects.create(属性='值') -- 通过实例化和实例化方法添加数据实例名 = 类名A.objects.get(pk='值') -- 通过主键查询赋值给实例对象类名B.objects.create(属性= 实例名) -- 将实例赋值给 一对多的外键字段即可完成赋值
通过主键查询获取值,将值赋值给设置了外键的字段进行关联
类名A.objects.create(属性='值') -- 通过实例化和实例化方法添加数据实例名 = 类名A.objects.get(pk='值') -- 通过主键查询赋值给实例对象实例名 = 类名B()实例名.属性= a -- 将实例对象赋值外键字段实例名.save()-- 通过id值也可以实例名.属性_id = 值实例名.save()
多对多
实例名 = 类名A.objects.get(pk='值') -- 获取自身的值实例名.属性.set([值1, 值2]) -- 通过设置自身多对多的字段完成关联设置
set 添加的是列表, 重新赋值,不是修改功能
实例名a= = 类名A.objects.get(pk='值') -- 获取自身的值实例名.属性.add(值1, 值2, 值3)
add 添加数值即可,添加的数据重复的会被保留,只会增加没有的部分
查询
- 大部分检索时懒惰执行的,只在真实获取值的时候( 即打印输出时 ),才会去连接数据库获取数据
- 查询集通过过滤器进行查询,允许链式调用
- pk 是主键( primary key )的别名,如果真实主键是 id,那么 pk 和 id 使用是一样的效果
过滤器
变量 = 类名.objects.get(主键=值)变量 = 类名.objects.get(id = 1)
- get 获取一个对象
- 如果查询的主键是 id 并且等于 1 的时候,可以使用 id = 1
- 如果条件找不到对应的记录,抛出错误: DoseNotExists
- 如果条件找到多个记录,抛出错误: MultipleObjectsReturned
all_变量名 = 类名.objects.all()
- 获取所有对象
- 查询所有,得到的 QuerySets 对象
类名.objects.filter(条件| 字段检索)
字段查找
- 过滤查询使用 filter,类似 SQL语句中的 WHERE
- filter 可以链式调用,如: filter().filter()
- 字段检索,是在字段名后加 「 」双下划线,如 字段名关键字
- 在查找中指定的字段必须是模型字段的名称,但是如果是 ForeignKey字段,则是 属性名+’_id’,如 blog_id=4,定义的 ForeignKey 是 blog
- 常见的字段检索:
- exact: 判断是否等于 value,一般不使用,而直接使用 ‘=’
- contains: 是否包含,大小写敏感。如果需要不敏感: icontains
- startswith| endwith: 以 value 开头| 结尾,大小写敏感
- in | not in: 是否包含在范围内
- isnull: 是否为 null,如 filter(name_isnull=False)
- gt| gte| lt| lte: 大于、大于等于、小于、小于等于
日期过滤
- 时间可以直接使用 gt| gte| lt| lte,如: 时间字段__gt=’2022-7-1’
- 查询某个时间段使用 range,如: 时间字段range(‘2021-7-1’, ‘2021-8-1’)
- 查询某年某月某日使用 date, 如: 时间字段date=’2022-7-1’
- 查询年使用 year| month| day| week_day,如: 时间字段__year=2022
- 支持切片,但不支持负数切片,如多个值筛选: filter(时间字段__year=2022)[1]
排序
filter(字段__字段检索).order by('字段1', '字段2')
字段前加 - ,表示降序排列
其它方法
- 结果集统计:count()
- 反转: reverse()
- 返回第一个| 最后一条对象: first()| last()
- 返回一个字典对象: values()。字典里面是数据记录,可以通过 values(‘key’) 获取具体的值
多对象关联
类名A.objects.filter(关联字段__类B的字段__检索)
类名.字段名__set.all()
聚合函数
- 使用 aggregate() 函数返回聚合函数的值
- 常用的聚合函数有: Avg()、Count()、Sum()、Max()、Min() ```powershell from django.bd.models import *
类名.objects.aggregate(Max(‘字段’)) — 返回的是字典
类名.objects.aggregate(max_字段 = Max(‘字段’)) — 自定义取别名
<a name="OLyVa"></a>#### 分组查询使用 annotate() 函数实现分组查询,但是要配合其他函数- **annotate: **用于分组,配合 Avg() 等聚合函数,如: annotate(Max('字段'))- **filter:** 用于过滤,在 annotate 之前使用表示 where 条件,在 annotate 之后使用表示 having 条件- **values:** 在 annotate 之前使用表示分组字段,在 annotate 之后使用表示取值```powershell类型.objects.values('分组字段').annotate(Count('字段')) -- 分组统计
修改
实例名 = 类名.objects.get()
实例名 = '值' -- 赋值方式修改
实例名.save()
适合单条记录修改
类名.objects.filter(过滤条件).update(headline=)
更新多个值
from django.db.models import F
类名.objects.filter(过滤条件).update(F())
删除
实例名 = 类名.objects.get()
实例名.delete()
刷新
实例名.refresh_from_db()
