根据已有的表自动生成模型:
在实际开发中,有些时候可能数据库已经存在了。如果我们用Django
来开发一个网站,读取的是之前已经存在的数据库中的数据。那么该如何将模型与数据库中的表映射呢?根据旧的数据库生成对应的ORM
模型,需要以下几个步骤:
-
Django
给我们提供了一个inspectdb
的命令,可以非常方便的将已经存在的表,自动的生成模型。想要使用inspectdb
自动将表生成模型。首先需要在settings.py
中配置好数据库相关信息。不然就找不到数据库。示例代码如下:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': "migrations_demo", 'HOST': '127.0.0.1', 'PORT': '3306', 'USER': 'root', 'PASSWORD': 'root' } }
那么通过
python manage.py inspectdb
,就会将表转换为模型后的代码,显示在终端
如果想要保存到文件中。那么可以使用>
重定向输出到指定的文件。比如让他输出到models.py
文件中。
python manage.py inspectdb > models.py
以上的命令,只能在终端执行,不能在pycharm中Tools->Run manage.py Task...
中使用。
如果只是想要转换一个表为模型。那么可以指定表的名字。示例命令如下:
python manage.py inspectdb article_article > models.py
-
修正模型:新生成的
ORM
模型有些地方可能不太适合使用。比如模型的名字,表之间的关系等等。那么以下选项还需要重新配置一下:- 模型名(类名):自动生成的模型,是根据表的名字生成的,可能不是你想要的。这时候模型的名字你可以改成任何你想要的。
- 模型所属app:根据自己的需要,将相应的模型放在对应的app中。
- 模型外键引用:将所有使用
ForeignKey
的地方,模型引用都改成字符串。这样不会产生模型顺序的问题。另外,如果引用的模型已经移动到其他的app中了,那么还要加上这个app的前缀。 - 让Django管理模型:将
Meta
下的managed=False
删掉,如果保留这个,那么以后这个模型有任何的修改,使用migrate
都不会映射到数据库中。
当有多对多的时候,应该也要修正模型。将中间表注释,然后使用ManyToManyField
来实现多对多。并且,使用ManyToManyField
生成的中间表的名字可能和数据库中那个中间表的名字不一致,这时候肯定就不能正常连接了。那么可以通过db_table
来指定中间表的名字。示例代码如下:
class Article(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
content = models.TextField(blank=True, null=True)
author = models.ForeignKey('front.User', models.SET_NULL, blank=True, null=True)
# 使用ManyToManyField模型到表,生成的中间表的规则是:article_tags
# 但现在已经存在的表的名字叫做:article_tag
# 可以使用db_table,指定中间表的名字
tags = models.ManyToManyField("Tag",db_table='article_tag')
class Meta:
db_table = 'article'
- 表名:切记不要修改表的名字。不然映射到数据库中,会发生找不到对应表的错误。
- 执行命令
python manage.py makemigrations
生成初始化的迁移脚本。方便后面通过ORM
来管理表。这时候还需要执行命令python manage.py migrate --fake-initial
,因为如果不使用--fake-initial
,那么会将迁移脚本会映射到数据库中。这时候迁移脚本会新创建表,而这个表之前是已经存在了的,所以肯定会报错。此时我们只要将这个0001-initial
的状态修改为已经映射,而不真正执行映射,下次再migrate
的时候,就会忽略他。 - 将
Django
的核心表映射到数据库中:Django
中还有一些核心的表也是需要创建的。不然有些功能是用不了的。比如auth
相关表。如果这个数据库之前就是使用Django
开发的,那么这些表就已经存在了。可以不用管了。如果之前这个数据库不是使用Django
开发的,那么应该使用migrate
命令将Django
中的核心模型映射到数据库中,使用python manage.py migrate [AppName]