Django笔记&教程 4-1 模型(Models)介绍

Django 自学笔记兼学习教程第4章第1节——模型(Models)介绍
点击查看教程总目录

参考:https://docs.djangoproject.com/en/2.2/topics/db/models/

1 介绍

模型是关于数据的唯一、确定的信息源。它包含存储数据的基本字段和行为。通常,每个模型映射到一个数据库表。

以上是官方文档的介绍,但对于初学者,这太绕了,
粗略的讲:
建立一个模型(Model)相当于建立了一个数据库表(table)。
模型规定属性,就是数据库表规定字段(field)。
每用模型类建立一个实例,都是在数据库表里插入一条数据。
准确地讲,可以这么理解模型:

  1. 每个数据库表,都是用来记录一种事物的数据信息的,比如学生表,是用来记录学生这种对象的多个维度的信息。每个信息维度(比如姓名、性别、生日、邮箱、学号)对应数据库表的一个字段。
  2. 对于学生这种对象,我们可以建立一个模型类(Model),模型的每个属性对应学生一个信息维度(比如姓名、性别、生日、邮箱、学号)。
  3. 数据库表的每一行,都是一个具体的学生的信息,对应也就是模型类(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),里面生成了很多个表,不过这个细说起来就复杂了。

以后我们如果修改了模型的属性之类,也要执行上面两句脚本去更新对应的数据库表。

上一篇:python测试开发django-rest-framework-93.反序列化(ModelSerializer)之UniqueTogetherValidator联合唯一校验


下一篇:java -verbose不为每个类提供文件位置