Django笔记&教程 4-1 模型(Models)介绍
Django 自学笔记兼学习教程第4章第1节——模型(Models)介绍
点击查看教程总目录
1 介绍
模型是关于数据的唯一、确定的信息源。它包含存储数据的基本字段和行为。通常,每个模型映射到一个数据库表。
以上是官方文档的介绍,但对于初学者,这太绕了,
粗略的讲:
建立一个模型(Model)相当于建立了一个数据库表(table)。
模型规定属性,就是数据库表规定字段(field)。
每用模型类建立一个实例,都是在数据库表里插入一条数据。
准确地讲,可以这么理解模型:
- 每个数据库表,都是用来记录一种事物的数据信息的,比如学生表,是用来记录学生这种对象的多个维度的信息。每个信息维度(比如姓名、性别、生日、邮箱、学号)对应数据库表的一个字段。
- 对于学生这种对象,我们可以建立一个模型类(Model),模型的每个属性对应学生一个信息维度(比如姓名、性别、生日、邮箱、学号)。
- 数据库表的每一行,都是一个具体的学生的信息,对应也就是模型类(Model)的一个实例。
2 示例
以简单的教务管理系统中的学生这种对象为例,
首先,我们分析出该对象需要的属性:
- 姓名(name)
- 性别(gender)
- 生日(birthday)
- 邮箱(email)
- 个人简介(info)
- 年级(grade)
- 年级子学号(number)
- 密码(password)
同时,一个学生能由年级+年级子学号唯一确定,则年级+年级子学号为其主键。
那么其model的示例写法如下
from django.db import models
class Student(models.Model):
gender = [
("m", "男"),
("f", "女")
]
name = models.CharField(max_length=50, verbose_name="姓名")
gender = models.CharField(max_length=10, choices=gender, default='m', verbose_name="性别")
birthday = models.DateField(verbose_name="生日")
email = models.EmailField(verbose_name="邮箱")
info = models.CharField(max_length=255, verbose_name="个人简介", help_text="一句话介绍自己,不要超过250字")
grade = models.CharField(max_length=4, verbose_name="年级")
number = models.CharField(max_length=6, verbose_name="年级子学号")
password = models.CharField(max_length=30, verbose_name="密码")
class Meta:
constraints = [
# 复合主键:保证 grade和number组合的student_id唯一
models.UniqueConstraint(fields=['grade', 'number'], name='student_id'),
]
具体的代码意思,我们在本章下一小节详细说明。
3 更新到数据库
在django框架下,并不是添加好模型(model)就万事大吉了
添加好模型后,我们还需要手动执行脚本,才能根据模型生成对应的数据库表。
在项目文件夹下,打开命令行,按行依次执行:
python manage.py makemigrations
python manage.py migrate
解释下上面这两句的作用
其中第1句会生成对应的迁移(migrations)命令。
如果是第一次运行的项目,由于是
那么会在./your_app/migrations
文件夹下,
生成0001_initial.py
用于记录迁移(migrations)命令
第一次运行也会在项目文件夹下,生成一个空的 database:db.sqlite3
第2句会执行第一句中生成的迁移(migrations)命令。
执行完第二句,改动才真正更新到数据库文件了。
当然,实际上,数据库中的改动并不是简单的添加了这一个模型的事,有兴趣的朋友可以打开此时的
db.sqlite3
看看。无法直接打开,需要使用对应的软件,我一般用DB Browser (SQLite),里面生成了很多个表,不过这个细说起来就复杂了。
以后我们如果修改了模型的属性之类,也要执行上面两句脚本去更新对应的数据库表。