django 数据库建表流程,与表结构
- 2019 年 10 月 8 日
- 筆記
目录
配置数据库
- 在Django项目的settings.py文件中,配置数据库连接信息:
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "你的数据库名称", # 需要自己手动创建数据库 "USER": "数据库用户名", "PASSWORD": "数据库密码", "HOST": "数据库IP", "PORT": 3306 } }
- 在与Django项目同名的目录下的
__init__.
py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:
import pymysql pymysql.install_as_MySQLdb()
- 注:数据库迁移的时候出现一个警告
WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it.
- 在配置中多加一个OPTIONS参数:Django官网解释
#解决办法一 OPTIONS: {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"}, #解决办法二 #去设置 mysql文件的的my.ini sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" #在输入命令重启mysql(windos系统) net stop mysql net start mysql
数据库迁移命名
#数据库迁移 命令(建议一起执行) python manage.py makemigrations python manage.py migrate #每次对models.py文件操作,都尽量执行迁移命名

创建表结构
- 例子 出版社表 图书表
- 出版社表
from django.db import models class Publisher(models.Model): pid = models.AutoField(primary_key=True) name = models.CharField(max_length=32, unique=True) """ 出版社 表设计 表名 Publisher pid为出版社的id,设置为主键,默认为int类型 primary_key=True 字段名为pid name为出版社的名字,限制字符长度32,设置唯一属性unique=True 字段名为name 还可以添加,电话,办公地址等字段,我这里就不添加了 """ class Book(models.Model): title = models.CharField(max_length=32) pub = models.ForeignKey("Publisher",on_delete=models.CASCADE) """ 图书 表设计 表名 Book title为书名 限制字符长度32 put为外键 models.ForeignKey ("Publisher")关联Publisher表 on_delete=models.CASCADE设置级联关系 """
- 表结构

- 级联删除 (设置级联的为弱势方,关联方删除,自己也会删除,自己删除,却不影响对方) 删除南方出版社,对应的 大胖小胖减肥日记图书也被删除了

- 级联删除,删图书 删除心里学1500问 看看对出版社表有影响吗?

- 学生 班级 表结构
class Class(models.Model): cid = models.AutoField(primary_key=True) cname = models.CharField(max_length=32, unique=True) """ cid 主键 cname 约束32位的字符,unique=True 约束唯一 """ class Student(models.Model): sid = models.AutoField(primary_key=True) s_name = models.CharField(max_length=32,null=False) gender = models.CharField(max_length=2,default='男') class_id = models.ForeignKey("Class",on_delete=models.CASCADE) """ sid 主键 s_name 字符 32位 非空约束 gendef 字符 2位 默认设置为男 class 外键 关联Class表 , 级联设置 """

多表关连的设置
- 还以出版社 图书 为例加上作者
#要实现作者表关联出版社和书记表,创建第四章表,来建立练习 #第一种 django帮我们生成第三张表 class Author(models.Model): name = models.CharField(max_length=32) books = models.ManyToManyField('Book') # 不在Author表中生产字段,自动生成第三张表 """ name 作者名字 32为字符 books Book和Author多对多的关系。books是Author跟Book关联的所有对象。books的作用是在 Author和Book中创建一个中间的关系对象,放在第三张表中,再根据这个中间的关系来获取Book中关联的对象 """

- 查看数据库


自创建关联表方法
class AuthorBook(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) book = models.ForeignKey(Book, on_delete=models.CASCADE) date = models.DateField() """ author 关联 Author作者表 外键 级联设置 book 关联 Book图书表 外键 级联设置 date 日期属性 可以添加更多字段,就操作比麻烦 """ #调用方法 author_obj = models.Author.objects.create(name=author_name) # 只插入book表中的内容 author_obj.books.set(books) # 设置作者和书籍多对多的关系
自建表 和 ManyToManyField 联合使用
class Author(models.Model): name = models.CharField(max_length=32) books = models.ManyToManyField('Book',through='AuthorBook') # through='AuthorBook' 不在Author表中生产字段, 也不生产第三张表 class AuthorBook(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE)#外键关联 Author表 级联设置 book = models.ForeignKey(Book, on_delete=models.CASCADE)#外键关联 Book表 级联设置 date = models.DateField()#可以设置更多字段
作 者:郭楷丰