Django新建数据模型、已有数据库建立模型方法

好记性不如乱笔头,记下来总是好的。。。
回复
BG6RSH
帖子: 132
注册时间: 周日 6月 23, 2019 12:00 pm

Django新建数据模型、已有数据库建立模型方法

帖子 BG6RSH »

这里例举了2种情况,第1种是新建数据模型(数据库中不存在同名表),第2种是数据库已经有表格了,需要根据已有表格自动生成数据模型。这里假设项目已经连接好了数据库,可进行下一步操作
一、新建数据模型。在models.py文件中根据Django规范建数据模型,如下举例代码
  1. class Users(models.Model):
  2.     employeeid = models.CharField(unique=True, max_length=10, verbose_name='工号')
  3.     name = models.CharField(max_length=20, verbose_name='姓名')
  4.     password = models.CharField(max_length=20, verbose_name='密码')
  5.  
  6.     admin_choices = (
  7.         (1, "是"),
  8.         (0, "否"),
  9.     )
  10.     admin = models.BooleanField('管理员', default=False, choices=admin_choices)
  11.     create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
  12.     update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
  13.     login_time = models.DateTimeField(auto_now=True, verbose_name='登录时间')
  14.  
  15.     # 输出对象时,设置显示出的内容
  16.     def __str__(self):
  17.         return self.name
  18.  
  19. class UserFields(models.Model):
  20.     user = models.ForeignKey(Users, related_name='user_fields', on_delete=models.CASCADE, verbose_name='用户名')
  21.     table_name = models.CharField('表名', max_length=20)
  22.     fields_opt = models.JSONField('字段设置', )
模型文件编辑完后,在项目manage.py所在目录命令行中执行
  1. python manage.py makemigrations
  2. python manage.py migrate

第一条命令会根据models.py文件在项目的"App\migrations"目录中生成生成数据库迁移文件,第二条命令会根据上条命令生成的代码,在数据库中生成(或叫数据迁移)User、UserFields两个数据表,同时还会自动生成Django自已需要的一些辅助表

二、根据已有表格自动生成数据模型。
在项目manage.py所在目录命令行中执行下面命令
  1. python manage.py inspectdb
该命令会根据连接的数据库中已有的数据表格,自动在models.py文件中生成模型代码,注意当表名为中文时,生成的代码class类名为空,需要手动添加中文名(与中文表名相同)。同时还需要添加“managed = False”语句,该语句的作用是在进行数据库迁移时,包含这个语句的模型不需要迁移,也就是告诉它不需要在数据库中对该表作修改。举例代码如下 :
  1. class 专项类别(models.Model):
  2.     序号 = models.AutoField(primary_key=True)
  3.     类别 = models.CharField(max_length=30)
  4.  
  5.     class Meta:
  6.         managed = False
  7.         db_table = '专项类别'
  8.  
  9.  
  10. class 作业区编码(models.Model):
  11.     序号 = models.AutoField(primary_key=True)
  12.     编码 = models.CharField(max_length=10, blank=True, null=True)
  13.     名称 = models.CharField(max_length=45, blank=True, null=True)
  14.  
  15.     def __str__(self):
  16.         return self.名称
  17.  
  18.     class Meta:
  19.         managed = False
  20.         db_table = '作业区编码'
回复