模型对象中有一个 objects属性,该属性是管理器 Manager类型的对象,几乎所有的方法都是通过该对象执行的。通过该方法可以进行数据库表添加数据

终端运行

  1. python manage.py shell

在 Django 控制台可以运行模型的方法,可以做简单的数据操作

新增

create 或 save 或 add

简单模型

  1. from 应用名.models import * -- 导入应用 models 下的所有模型
  2. 类名.objects.create(属性='值') -- 通过 create 赋值形式给数据库字段添加数据
  1. from 应用名.models import * -- 导入应用 models 下的所有模型
  2. 实例名 = 类名(属性='值') -- 通过实例化和实例化方法添加数据
  3. 实例名.save()

一对一

  1. from 应用名.models import * -- 导入应用 models 下的所有模型
  2. 类名A.objects.create(属性='值') -- 通过实例化和实例化方法添加数据
  3. 实例名a = 类名A.objects.get(pk=1) -- 通过主键查询赋值给实例对象
  4. 类名B.objects.create(属性=a) -- 将实例赋值给 一对一的主键字段即可完成赋值

一对一赋值必须先添加好被关联的数据,再通过主键查询获取值,赋值给设置了主键的字段进行关联

一对多

  1. 类名A.objects.create(属性='值') -- 通过实例化和实例化方法添加数据
  2. 实例名 = 类名A.objects.get(pk='值') -- 通过主键查询赋值给实例对象
  3. 类名B.objects.create(属性= 实例名) -- 将实例赋值给 一对多的外键字段即可完成赋值

通过主键查询获取值,将值赋值给设置了外键的字段进行关联

  1. 类名A.objects.create(属性='值') -- 通过实例化和实例化方法添加数据
  2. 实例名 = 类名A.objects.get(pk='值') -- 通过主键查询赋值给实例对象
  3. 实例名 = 类名B()
  4. 实例名.属性= a -- 将实例对象赋值外键字段
  5. 实例名.save()
  6. -- 通过id值也可以
  7. 实例名.属性_id =
  8. 实例名.save()

多对多

  1. 实例名 = 类名A.objects.get(pk='值') -- 获取自身的值
  2. 实例名.属性.set([值1, 2]) -- 通过设置自身多对多的字段完成关联设置

set 添加的是列表, 重新赋值,不是修改功能

  1. 实例名a= = 类名A.objects.get(pk='值') -- 获取自身的值
  2. 实例名.属性.add(值1, 2 3)

add 添加数值即可,添加的数据重复的会被保留,只会增加没有的部分

查询

  • 大部分检索时懒惰执行的,只在真实获取值的时候( 即打印输出时 ),才会去连接数据库获取数据
  • 查询集通过过滤器进行查询,允许链式调用
  • pk 是主键( primary key )的别名,如果真实主键是 id,那么 pk 和 id 使用是一样的效果

过滤器

  1. 变量 = 类名.objects.get(主键=值)
  2. 变量 = 类名.objects.get(id = 1)
  • get 获取一个对象
  • 如果查询的主键是 id 并且等于 1 的时候,可以使用 id = 1
  • 如果条件找不到对应的记录,抛出错误: DoseNotExists
  • 如果条件找到多个记录,抛出错误: MultipleObjectsReturned
  1. all_变量名 = 类名.objects.all()
  • 获取所有对象
  • 查询所有,得到的 QuerySets 对象
  1. 类名.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]

排序

  1. filter(字段__字段检索).order by('字段1', '字段2')

字段前加 - ,表示降序排列

其它方法

  • 结果集统计:count()
  • 反转: reverse()
  • 返回第一个| 最后一条对象: first()| last()
  • 返回一个字典对象: values()。字典里面是数据记录,可以通过 values(‘key’) 获取具体的值

多对象关联

  1. 类名A.objects.filter(关联字段__B的字段__检索)
  1. 类名.字段名__set.all()

聚合函数

  • 使用 aggregate() 函数返回聚合函数的值
  • 常用的聚合函数有: Avg()、Count()、Sum()、Max()、Min() ```powershell from django.bd.models import *

类名.objects.aggregate(Max(‘字段’)) — 返回的是字典

类名.objects.aggregate(max_字段 = Max(‘字段’)) — 自定义取别名

  1. <a name="OLyVa"></a>
  2. #### 分组查询
  3. 使用 annotate() 函数实现分组查询,但是要配合其他函数
  4. - **annotate: **用于分组,配合 Avg() 等聚合函数,如: annotate(Max('字段'))
  5. - **filter:** 用于过滤,在 annotate 之前使用表示 where 条件,在 annotate 之后使用表示 having 条件
  6. - **values:** 在 annotate 之前使用表示分组字段,在 annotate 之后使用表示取值
  7. ```powershell
  8. 类型.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()