目录
配置数据库
创建表结构
多表关的设置
自创建关联表方法
自建表 和 ManyToManyField 联合使用
配置数据库
在 Django 项目的 settings.py 文件中, 配置数据库连接信息:
- DATABASES = {
- "default": {
- "ENGINE": "django.db.backends.mysql",
- "NAME": "你的数据库名称", # 需要自己手动创建数据库
- "USER": "数据库用户名",
- "PASSWORD": "数据库密码",
- "HOST": "数据库 IP",
- "POST": 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
创建表结构
例子 出版社表 图书表
出版社表
- 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()# 可以设置更多字段
来源: http://www.bubuko.com/infodetail-3097874.html