上文我们将MTV的时候,没有用到M,那么本章我们就来讲下django的模型。

我们已经创建了一个project应用出来,也就是项目,我们来想想,项目应该包含哪些内容?像最简单的项目名称,项目描述,创建时间,更新时间得有吧,ok,那我们就按最简单的来。我们目前确定了4个字段,项目名称,项目描述,创建时间,更新时间。那这些字段存在哪里呢?我相信大家都知道,那肯定是数据库,既然有数据库,肯定得有表不是,那么我们设计表怎么设计呢?

首先确定字段:id,name,desc,create_time,update_time

当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作

写个建库建表语句

  1. CREATE DATABASE caseplatform charset=utf8;
  2. CREATE TABLE `project_projects` (
  3. `id` bigint NOT NULL AUTO_INCREMENT,
  4. `name` varchar(200) NOT NULL,
  5. `desc` varchar(200) DEFAULT NULL,
  6. `create_time` datetime(6) NOT NULL,
  7. `update_time` datetime(6) NOT NULL,
  8. PRIMARY KEY (`id`),
  9. UNIQUE KEY `name` (`name`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

想想看还是挺麻烦的,既然我们使用django,看看django有没有办法帮我们解决建表的麻烦。我们来看看官方文档怎么说的。

模型是您的数据唯一而且准确的信息来源。它包含您正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。
  • 综上诉说,Django 给你一个自动生成访问数据库的 API

    快速上手

    我们打开我们的项目,找到project目录下面的models.py,写下如下代码: ```python from django.db import models

Create your models here.

class Projects(models.Model): name = models.CharField(max_length=200, unique=True) desc = models.CharField(max_length=200, null=True, blank=True, default=’’) create_time = models.DateTimeField(auto_now_add=True) update_time = models.DateTimeField(auto_now=True)

  1. 上面代码怎么理解呢?我们创建了一个Projects类,这个类可以理解为我们的表名,idnamedesccreate_timeupdate_time是我们的字段名。理解了这些我们再来看看models.AutoFieldmodels.CharFieldmodels.DateTimeField这些是什么鬼。其实models.AutoFieldmodels.CharFieldmodels.DateTimeField是模型字段类,比如id,是主键,就用AutoField类型,namedesc是字符串,就用CharFieldcreate_timeupdate_time是日期,就用DateTimeField类型。那么django有哪些模型字段类呢?
  2. | 字段类 | 默认小组件 | 说明 |
  3. | --- | --- | --- |
  4. | AutoField | N/A | 根据 ID 自动递增的 IntegerField |
  5. | BigIntegerField | NumberInput | 64 位整数,与 IntegerField 很像,但取值范围是 -9223372036854775808 9223372036854775807 |
  6. | BinaryField | N/A | 存储原始二进制数据的字段。只支持 bytes 类型。注意,这个字段的功能有限。 |
  7. | BooleanField | CheckboxInput | 真假值字段。如果想接受 null 值,使用 NullBooleanField |
  8. | CharField | TextInput | 字符串字段,针对长度较小的字符串。大量文本应该使用 TextField 。有个额外的必须参数:max_length ,即字段的最大长度(字符个数)。 |
  9. | DateField | DateInput | 日期,在 Python 中使用 datetime.date 实例表示。有两个额外的可选参数: auto_now ,每次保存对象时自动设为当前日期 auto_now_add ,创建对象时自动设为当前日期。 |
  10. | DateTimeField | DateTimeInput | 日期和时间,在 Python 中使用 datetime.datetime 实例表示。与 DateField 具有相同的额外参数。 |
  11. | DecimalField | TextInput | 固定精度的小数,在 Python 中使用 Decimal 实例表示。有两个必须的参数: max_digits decimal_places |
  12. | DurationField | TextInput | 存储时间跨度,在 Python 中使用 timedelta 表示。 |
  13. | EmailField | TextInput | 一种 CharField ,使用 EmailValidator 验证输入。max_length 的默认值为 254 |
  14. | FileField | ClearableFileInput | 文件上传字段。详情见下面。 |
  15. | FilePathField | Select | 一种 CharField ,限定只能在文件系统中的特定目录里选择文件。 |
  16. | FloatField | NumberInput | 浮点数,在 Python 中使用 float 实例表示。注意, field.localize 的值为 False 时,默认的小组件是 TextInput |
  17. | ImageField | ClearableFileInput | 所有属性和方法都继承自 FileField ,此外验证上传的对象是不是有效的图像。增加了 height width 两个属性。需要 Pillow 库支持。 |
  18. <a name="7c7366fc"></a>
  19. ## 字段选项
  20. - null:如果为TrueDjango 将空值以NULL 存储到数据库中,默认值是 False
  21. - blank:如果为True,则该字段允许为空白,默认值是 False<br />对比:null是数据库范畴的概念,blank是表单验证证范畴的
  22. - default:默认值
  23. - primary_key:若为 True, 则该字段会成为模型的主键字段
  24. - unique:如果为 True, 这个字段在表中必须有唯一值
  25. ok,模型类创建好了,我们怎么生成我们的数据表呢?其实只要2行命令即可,但是!我们需要先注册project应用,我们打开setting.py

INSTALLED_APPS = [ ‘django.contrib.admin’, ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.messages’, ‘django.contrib.staticfiles’, ‘project’, # 添加project应用 ]

生成迁移脚本

(env) D:\code\caseplatform>python manage.py makemigrations

  1. 我们发现多了一个0001_initial.py文件,我们可以使用`python manage.py sqlmigrate project 0001_initial`查看建表语句<br />![image-20220224153459406.png](https://cdn.nlark.com/yuque/0/2022/png/1700290/1651219045931-6feabc02-fb32-469b-8a4a-4787d93ee5a1.png#clientId=uecb58828-492e-4&from=drop&id=ucabe6d3a&originHeight=374&originWidth=539&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23402&status=done&style=none&taskId=u69ce94f1-c1e2-4e40-8266-5902d817b87&title=)

(env) D:\code\caseplatform>python manage.py sqlmigrate project 0001_initial

  1. > --
  2. > -- Create model Projects
  3. > --
  4. > CREATE TABLE `project_projects` (`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(200) NOT NULL UNIQUE, `desc` varchar(200) NULL, `create_time` datetime(6) NOT NULL, `up date_time` datetime(6) NOT NULL);
  5. 注意!到这里我们还没有生成我们的数据表,想要生成数据表还需要使用以下命令

生成数据表

(env) D:\code\caseplatform>python manage.py migrate

  1. > Operations to perform:<br />Apply all migrations: admin, auth, contenttypes, project, sessions<br />Running migrations:<br />Applying contenttypes.0001_initial... OK<br />Applying auth.0001_initial... OK<br />Applying admin.0001_initial... OK<br />Applying admin.0002_logentry_remove_auto_add... OK<br />Applying admin.0003_logentry_add_action_flag_choices... OK<br />Applying contenttypes.0002_remove_content_type_name... OK<br />Applying auth.0002_alter_permission_name_max_length... OK<br />Applying auth.0003_alter_user_email_max_length... OK<br />Applying auth.0004_alter_user_username_opts... OK<br />Applying auth.0005_alter_user_last_login_null... OK<br />Applying auth.0006_require_contenttypes_0002... OK<br />Applying auth.0007_alter_validators_add_error_messages... OK<br />Applying auth.0008_alter_user_username_max_length... OK<br />Applying auth.0009_alter_user_last_name_max_length... OK<br />Applying auth.0010_alter_group_name_max_length... OK<br />Applying auth.0011_update_proxy_permissions... OK<br />Applying auth.0012_alter_user_first_name_max_length... OK<br />Applying project.0001_initial... OK<br />Applying sessions.0001_initial... OK
  2. 数据表生成完了,我们去哪里看呢?我们可以使用django 自带的sqllite数据库查看,也可以使用mysql查看。因为我们没改数据库配置,所以生成的表在django自带的sqllite数据库里面。如果我们想用mysql数据库查看,怎么做呢?
  3. <a name="8917af17"></a>
  4. ## Django 模型CRUD
  5. 我们先来学习下如何在django 自带的shell操作数据库
  6. <a name="77a0486f"></a>
  7. ### c(create) 创建数据
  8. 打开pycharm Terminal,输入如下内容

(env) D:\code\caseplatform>python manage.py shell

from project.models import Projects project=Projects(name=’这是一个测试项目’) project.save()

  1. 打开数据库<br />![image-20220224173914580.png](https://cdn.nlark.com/yuque/0/2022/png/1700290/1651219123748-43428e53-28c8-45e5-8486-048b4dd76cb0.png#clientId=uecb58828-492e-4&from=drop&id=u10b16b56&originHeight=216&originWidth=629&originalType=binary&ratio=1&rotation=0&showTitle=false&size=42134&status=done&style=none&taskId=u602a6529-6988-4ddb-93cb-87cf9b00857&title=)<br />需要说明的是, 表的 id 字段已经设置了自增, 所以, 该字段为空可以添加数据。
  2. <a name="8fcfdb54"></a>
  3. ### r(retrieve)查询数据
  4. 我们知道查询一般有查询所有,指定查询,模糊查询,那么下面我们就按这三种方式来进行查询

Projects.objects.all()

]> p =Projects .objects.get(id=1) p

p.name ‘这是一个测试项目’ p2 = Projects.objects.filter(name__contains=”testdog”) p2

```

Projects.objects.all():查询所有
Projects.objects.get(id=1):指定查询
Projects.objects.filter(name__contains=”testdog”):name含有testdog的模糊查询

u(update)更新数据

第一种方式:先获取模型类对象,然后修改某些字段,再调用save方法保存

  1. >>> p =Projects.objects.get(id=1)
  2. >>> p.name = "testdog"
  3. >>> p.save()

image-20220224175045826.png
第二种方式

  1. >>> Projects.objects.filter(id=1).update(name='下班了')
  2. 1

image-20220224175354614.png

d(delete)删除数据

  1. >>> p =Projects.objects.get(id=1)
  2. KeyboardInterrupt
  3. >>> p.delete()
  4. (1, {'project.Projects': 1})
  5. >>>

image-20220224175450918.png