Django中ORM创建表关系
一:django中ORM创建表关系
- ORM创建外键关系
1.表与表之间的关系
1.表与表之间的关系
一对多
一对一
多对多
2.操作目标条件:
图书表
出版社表
作者表
作者详情表
3.外键关联
一对多:
图书和出版社是一对多的关系 外键字段建在多的那一方 book
多对多:
图书和作者是多对多的关系 需要创建第三张表来专门存储
一对一:
作者与作者详情表是一对一
4.表关系的判断
换位思考
ORM针对外键字段的创建位置
1.不常用的数据我们称之为冷数据
2.常用的数据我们称之为热数据
一对多: 外键创建在多的一方
一对一: 建在任何一方都可以 但是推荐建在查询频率较高的表中
多对多: orm自动帮你创建第三张关联表
2.ORM中如何定义三种关系
1.一对多
(图书和出版社是一对多) 并且书是多的一方 所有外键字段放在书表里面
# 默认就是与出版社表的主键字段做外键关联
publish = models.ForeignKey(to='Publish')
如果字段对应的是Foreignkey 那么会orm会自动子啊字段的后面加_id
如果自己自作聪明的加了id 那么orm还是会在后面继续加_id
后面在定义Foreignkey的时候就不要自己加_id
2.多对多
# 自动帮你创建书籍和作者的第三张表
authors = models.ManyToManyField(to='Author')
authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表
3.一对一
# 作者与作者详细是一对一的关系 外键建在查询频率较高的表中
author_detail = models.OneToOneField(to='AuthorDetail')
OneToOneField也会自动给字段加_id后缀
所有不要自作聪明 自己加后缀_id
# 会自动在字段后面加_id后缀
ForeignKey
OneToOneField
3.ORM创建表关系models.py文件
from django.db import models
# 图书表
class Book(models.Model):
# title varchar(32)
title = models.CharField(max_length=32)
# 总共八位 小数点后面占两位 9价格)
print = models.DecimalField(max_digits=8,decimal_places=2)
# (图书和出版社是一对多) 并且书是多的一方 所有外键字段放在书表里面
# 默认就是与出版社表的主键字段做外键关联
publish = models.ForeignKey(to='Publish')
"""
如果字段对应的是Foreignkey 那么会orm会自动子啊字段的后面加_id
如果自己自作聪明的加了id 那么orm还是会在后面继续加_id
后面在定义Foreignkey的时候就不要自己加_id
"""
# # 自动帮你创建书籍和作者的第三张表
authors = models.ManyToManyField(to='Author')
# authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
# 让orm自动帮你创建第三张关系表
# 出版社表
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
# 作者表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
# 作者与作者详细是一对一的关系 外键建在查询频率较高的表中
author_detail = models.OneToOneField(to='AuthorDetail')
"""
OneToOneField也会自动给字段加_id后缀
所有不要自作聪明 自己加后缀_id
"""
# 作者详细信息表
class AuthorDetail(models.Model):
# phone 电话
phone = models.BigIntegerField() # 或者直接字符类型
# addr 地址
addr = models.CharField(max_length=32)
4.在settings.py配置文件修改配置
- mysql提前创建好库
1.在settings.py配置文件修改配置
"""django默认使用自带的sqlite3"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day60', # 数据库名称 一定要事先创建好才能指定
'HOST':'127.0.0.1', # 数据库IP,暂用本地回环地址
'PORT':3306, # 数据库端口
'USER':'root', # 数据库用户名
'PASSWORD':'123', # 数据库密码
'CHARSET':'utf8' # 指定字符编码
}
}
5.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
2.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
import pymysql
pymysql.install_as_MySQLdb()
在django1.X版本中外键默认都是级联更新删除的

Django中ORM创建表关系的更多相关文章
- Django之ORM多表关系创建
ORM模型多表逻辑创建: 以图书和作者关系模型为例: models.py from django.db import models ''' 一本书只能被一个出版社出版; 一个出版社可以出版多本书; 一 ...
- ORM以及Django使用ORM创建表
day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n k1:v1\r\n ...\r\n \r\n ...
- Python--day61--ORM介绍及Django使用ORM创建表
ORM: 使用django的ORM详细步骤:(pymysql操作数据库:) #1,自己动手创建数据库(create database 数据库名字;) #2,在Django项目中(setting.py文 ...
- django 数据库 ORM创建表单是出错
WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default' HINT: MySQL ...
- django中orm多表查询,减少数据库查询操作
.select_related() 的使用
- Django中ORM多对多表的操作
自己创建第三张表建立多对多关系 表的创建 # 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 class Student(models.Model): name = mode ...
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Django中ORM对数据库的增删改查操作
前言 什么是ORM? ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...
随机推荐
- 微服务架构 | 3.1 Netflix Eureka 注册中心
目录 前言 1. Eureka 基础知识 1.1 Eureka 模型中的服务器与客户端 1.2 Eureka 的 30s 启动机制 1.3 Eureka 为什么注册服务的 IP ,而不是主机名 1.4 ...
- Termux搭建hexo博客并部署到GitHub
Termux搭建hexo博客并部署到GitHub 安装 termux-change-repo apt update apt install git && nodejs &&am ...
- 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse
<设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...
- VUE3 之 Non-Props 属性
1. 概述 墨菲定律告诉我们:人总是容易犯错误的,无论科技发展到什么程度,无论是什么身份的人,错误总是会在不经意间发生.因此我们最好在做重要的事情时,尽量去预估所有可能发生的错误,并思考错误发生后的补 ...
- golang中的标准库flag
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...
- golang中的标准库time
时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...
- WPS修改批注部分的字体颜色?
今天遇到一个问题,就是复制文档的时候有几块红色字体想改成黑色,怎么也改不成功,通过修改字体颜色无效,通过百度找到了解决方法记录一下. 解决方法 审阅--显示标记--点击插入和删除(去掉前面的对钩即可) ...
- java 方法实例
// 方法 public class Demo { public static void main(String[] args) { m(); m2(2); m3('3', 4); m4(4, 6); ...
- Python 调用 Shell
- python网络爬虫-python基础(三)
python安装 Anaconda的python科学计算环境,只需要想普通软件一样安装就可以把python的环境变量.解释器.开发环境都安装到计算机中 除此之外anaconda还提供众多的科学计算的包 ...