Ⅰ 需要创建的表
- 表
- Book -- 图书表
- Publish -- 出版社
- Author -- 作者表
- AuthorDatail -- 作者详情表
- 表关系
- 作者和作者详情是一对一关系,关联字段写在哪里都可以
- 图书和出版社是一对多关系,一对多关系一旦确立,关联字段写在多的一方
- 图书和作者是多对多关系,多对多的关系需要建立第三张表(Django的ORM中可以自动生成)
- models.py文件
# 多表模型创建
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=6,decimal_places=2)
publish_date = models.DateTimeField(auto_now_add=True)
publish = models.ForeignKey(to='Publish') # 不写,默认关联主键
# 自动创建出第三张表
# authors 在数据库中不存在改字段
# 默认情况:第三张表有自身的id字段,和当前表的id字段及Author表的id字段,不能新增字段
authors = models.ManyToManyField(to='Author')
class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
addr = models.CharField(max_length=128)
phone = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.SmallIntegerField()
author_detail = models.OneToOneField(to='AuthorDatail')
class AuthorDatail(models.Model):
id = models.AutoField(primary_key=True)
res = (('1','男'),('2','女'),('0','保密'),)
sex = models.SmallIntegerField(choices=res)
addr = models.CharField(max_length=64)
phone = models.BigIntegerField()
Ⅱ 迁移到mysql数据库中
- 配置文件
- settings.py文件
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 原配置
'default':{
'ENGINE':'django.db.backends.sqlite3',
'NAME':'book',
'USER':'toot',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':3306 }} # 新配置属性,Django的ORM不能创建数据库,我们需要手动创建一个库,
- 新建数据库 -- 若使用原有库,里面不能有表,否则无法迁移
- 提前在mysql中建立数据库:book 同上方配置文件name对应
- 在app01/__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
- pycharm/Tools/Run manage.py Task
- 两条命令
- makemigrations
- migrate
- Navicat中查看表结构
Ⅲ 外键关系要不要建立
- 关联字段与外键约束没有必然的联系(建管理字段是为了进行查询,建约束是为了不出现脏数据)
- 默认情况,关联关系建好以后,外键约束就自然建立了
- 实际工作中,外键约束一般不建(影响效率),都是人为约束(代码约束)
- -db_constraint=False
- 表模型和数据库表的对应,不要直接修改表(这是可以的,但是不建议),要修改表模型,同步到表中