模型(Model) 是数据的载体, 记录了属性, 模型之间的关系. Django 提供了父类models.Model, 继承它以后, Django 会自动生成数据库表以及对应的增删改查.
创建Model
上一节我们已经配置好了MySQL 并创建了数据库dazhi, 现在需要创建好Model, 分别是Project(项目), Task(任务), Statistic(数据统计), 每个Model 都声明各个实体类所包含的属性. 统一写在dazhi应用的modes.py 文件里.
# ./dazhi/models.py
from django.db import models
# Create your models here.
class Project(models.Model):
id = models.BigIntegerField(db_comment='编号', primary_key=True, auto_created=False)
name = models.CharField(max_length=256, db_comment='名称')
info = models.CharField(max_length=256, db_comment='描述', null=True, blank=True)
created_by = models.CharField(max_length=128, db_comment='创建人')
person_in_charge = models.CharField(max_length=128, db_comment='负责人')
create_time = models.BigIntegerField(db_comment='创建时间')
updated_by = models.CharField(max_length=128, db_comment='更新人')
update_time = models.BigIntegerField(db_comment='更新时间')
status = models.IntegerField(db_comment='状态:1todo, 2doing, 3done, 4deleted', default=1)
class Task(models.Model):
id = models.BigIntegerField(db_comment='编号', primary_key=True, auto_created=False)
name = models.CharField(max_length=256, db_comment='名称')
info = models.CharField(max_length=256, db_comment='描述', null=True, blank=True)
created_by = models.CharField(max_length=128, db_comment='创建人')
person_in_charge = models.CharField(max_length=128, db_comment='负责人')
start_time = models.BigIntegerField(db_comment='开始时间')
end_time = models.BigIntegerField(db_comment='结束时间')
create_time = models.BigIntegerField(db_comment='创建时间')
updated_by = models.CharField(max_length=128, db_comment='更新人')
update_time = models.BigIntegerField(db_comment='更新时间')
status = models.IntegerField(db_comment='状态:1todo, 2doing, 3done, 4deleted', default=1)
class Statistic(models.Model):
id = models.BigIntegerField(db_comment='编号', primary_key=True, auto_created=False)
statistic_type = models.IntegerField(db_comment='统计类型:1项目, 2任务')
statistic_value = models.CharField(max_length=256, db_comment='统计值')
created_by = models.CharField(max_length=128, db_comment='创建人')
create_time = models.BigIntegerField(db_comment='创建时间')
update_time = models.BigIntegerField(db_comment='更新时间')
updated_by = models.CharField(max_length=128, db_comment='更新人')
class Meta:
db_table = "dazhi_statistic"
def save(self, *args, **kwargs):
do_something()
super().save(*args, **kwargs)
do_something_else()
Model 语法
以Statistic 这个Model 为例, 可以看到它主要包含三部分:
字段定义: 通过models 提供的方法来创建对应数据库类型的字段, 同时可以指定字段长度, 是否可以为空等
Meta 内部类: Meta 这个单词有元信息的意思, 可以用来声明数据库表名, 约束等
自定义方法: 我们创建的Model 都继承了models.Model, Django 通过这种方式来为Model 生成建表语句和增删改查方法, 我们也重写models.Model 父类的方法. 来实现个性化需求
同步数据库
创建好Model 后, 需要执行迁移命令, 所谓迁移, 就是将程序中实体类定义的字段和关系, 转换成数据库中的表 迁移是通过 django 提供的两个迁移命令来实现的:
# 为应用dazhi 创建迁移文件
python mange.py makemigrations dazhi
# 执行迁移
python manage.py migrate
迁移完毕后, 查看数据库, 就可以看到dazhi 数据库里已经创建好了3张表. 以后如果修改了models.py 文件, 都要执行迁移, 将变更同步到数据库.