在实际开发中,有些时候可能数据库已经存在了。如果我们用Django来开发一个网站 ,读职的是之前已经存在的数据库中的数据。
那么该如何将模型与数据库中的表映射呢?根据旧的数据库生成对应的ORM模型,需要以下几个步骤:

1、Django 给我们提供了一个inspectdb的命令,可以非常方便的将已经存在的表,自动的生成模型。想要使用inspectab自动将
表生成模型。首先需要在settings.py 中配置好数据库相关信息不然就找不到数据库。示例代码如下:

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘database_name’,
‘HOST’: ‘127.0.0.1’,
‘PORT’: ‘3306’,
‘USER’: ‘your_database_name’,
‘PASSWORD’: ‘your_database_password’,
}
}

再通过 python manage.py inspectdb 就会将表转换为模型后的代码显示在终端。

不过以上代码只是显示在终端,如果想要保存到文件,可以指定重定向文件,比如输出到 models.py 文件中,需要执行:

python manage.py inspectdb > models.py

以上命令只能在终端中执行,不能在pycharm->Tools->Run manage.py Task…中使用

如果只想要转换一个表生成模型,可以执行以下语句:python manage.py inspectdb table_name > models.py

 

 

2、修正模型:新生成的ORM模型有些地方可能不太适合使用。比如模型的名字,表之间的关系等等。那么以下选项还需要重新配置:
(1)、模型名:自动生成的模型,是根据表的名字生成的,可能不是你想要的。这时候模型的名字你可以改成任何你想要的。
模型所属app:根据自己的需要,将相应的模型放在对应的app中。放在同个app中也是没有任何问题的。只是不方便管
理。

(2)、模型外键引用:将所有使用Foreignkey 的地方,模型引用都改成字符串。这样不会产生模型顺序的问题。另外,如果引用
的模型已经移动到其他的app中了,那么还要加上这个app的前缀。
(3)、让Django管理模型:将Meta下的managed=False 删掉,如果保留这个,那么以后这个模型有任何的修改,使用migrate都不会映射到数据库中。
(4)、表名:切记不要修改表的名字(这里的表名不是模型类名,而是class Meta: 中的db_table)。不然映射到数据库中,会发生找不到对应表的错误。

 

 

3、执行命令python manage.py makemigrations生成初始化的迁移脚本。方便后面通过ORM来管理表。在这时候还需要执行命令python manage.py migrate –fake-initial,因为如果不使用–fake-initial,那么会将迁移脚本会映射到数据库中。这时候迁移脚本会新到建表,而这个表之前是已经存在了的,所以肯定会报错。此时我们只要将这个0001-initial 的状态修改为已经映射,而不真正执行映射,下次再migrate的时候,就会忽略他。

 

4、将Django的核心表映射到数据库中: Django中还有那些核心的表也是需要创建的。不然有些功能是用不了的。比如auth相关
表。如果过个数据库之前就是使用Django开发的,那么这些表就已经存在了,可以不用管了。如果之前这个数据库不是使用Django开发的,那么应该使用python manage.py migrate命令将Django中的核心模型映射到数据库中。

————————————————
版权声明:本文为CSDN博主「Timplan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42128241/article/details/101847121

原文地址:http://www.cnblogs.com/zhangxingcomeon/p/16853493.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性