Django-Vue 实战开发 第3章 Django 三剑客之模型

163 阅读2分钟

模型(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 文件, 都要执行迁移, 将变更同步到数据库.