当前位置: 首页 > news >正文

Django——orm模块创建表关系

django orm中如何创建表关系

1. 表关系分析

表与表之间的关系: 一对多 多对多  一对一 没有关系
判断表关系的方法: 换位思考用4张表举例:  图书表 出版社表 作者表 作者详情表图书和出版社是一对多的关系 外键字段建在多的那一方图书和作者是多对多的关系 需要创建第三张表来专门存储作者与作者详情表是一对一   提示: 创建表关系  先将基表创建出来 然后再添加外键字段. 这里建表可以没有先后顺序, 不同于mysql中建立外键的创建表以及插入记录的先后顺序.

 

2. 建立表

book
idtitlepricepublish_id
1python从入门到入土123.121
2生蚝的吃法大全666.661
3说不是渣男本质其实就是444.442
author
idnameage
1jason84
2egon73
book2author
idbook_idauthor_id
111
212
322
433
publish
idnameadd
1北方出版社北京
2南方出版社南京
author2detail
idphoneinfo
180080088我喜欢跑步, 所以我是跑王
288888888我喜欢吃生蚝和装逼

 

3. 建立外键表关系基本语法

# django orm中建立表关系一对一:author_detail = models.OneToOneField(to='AuthorDetail')一对多:publish = models.ForeignKey(to='Publish')多对多:authors = models.ManyToManyField(to='Book')拓展: 还可以有另一种书写方式, 不过这种方式必须放在被关联的类后. 这里必须放在Publish定义之后publish = models.ForeignKey(to=Publish)# 特点和注意事项:1. 先建立基表最后再建立外键关系, 没有sql中建立外键必须先建立被关联表, 加入记录先插入被关联表这么一说, 直接建立就行.2. django 1.x版本无序指定级联更新级联删除, 默认会帮你指定.3. 一对多, 一对一无需在需要关联的字段后面加_id, 默认会帮你加. 例如: publish -> publish_id4. 一对多的表关系外键字段建立在多的一方5. 多对多的表关系无需类似于sql语句需要建立中间表, 会默认帮你创建虚拟的中间表6. 一对一, 多对多的表关系外键字段建立在查询频率较高的地方.

4. 在models.py中创建以上模型类

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=255, verbose_name='书名')price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')  # 总共八位 小数点后面占两位# 一. 建立一对多关系: 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面"""如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id如果你自作聪明的加了_id那么orm还是会在后面继续加_id后面在定义ForeignKey的时候就不要自己加_id"""publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联# 二. 建立多对多关系: 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方"""authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系让orm自动帮你创建第三张关系表"""authors = models.ManyToManyField(to='Author')class Publish(models.Model):name = models.CharField(max_length=255, verbose_name='出版社名称')addr = models.CharField(max_length=255, verbose_name='出版社地址')class Author(models.Model):name = models.CharField(max_length=255, verbose_name='作者姓名')age = models.IntegerField(verbose_name='作者年龄')# 三. 建立一对一关系: 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中"""OneToOneField也会自动给字段加_id后缀所以你也不要自作聪明的自己加_id"""author_detail = models.OneToOneField(to='AuthorDetail')class AuthorDetail(models.Model):phone = models.BigIntegerField(verbose_name='作者电话号码')addr = models.CharField(max_length=255, verbose_name='作者家庭住址')

django请求生命周期流程图

相关文章:

  • 键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵解决方案(亲测可以解决)
  • 【狂神说Java】Dubbo + Zookeeper
  • Kotlin基本语法
  • 深度学习pytorch之hub模块
  • Flutter笔记:光影动画按钮、滚动图标卡片组等
  • QT基础与细节理解
  • 开机自启动笔记本的小键盘
  • 【Spring之底层核心架构概念解析】
  • Docker快速安装kafka
  • EM@解三角形@正弦定理@余弦定理
  • 云效流水线docker部署 :node.js镜像部署VUE项目
  • 大数据毕业设计选题推荐-农作物观测站综合监控平台-Hadoop-Spark-Hive
  • Swift编写爬取商品详情页面的爬虫程序
  • MATLAB算法实战应用案例精讲-【目标检测】机器人抓取
  • MATLAB算法实战应用案例精讲-【目标检测】机器视觉-工业相机参数
  • 网络传输文件的问题
  • Angular 2 DI - IoC DI - 1
  • HTML中设置input等文本框为不可操作
  • k个最大的数及变种小结
  • mongo索引构建
  • mysql_config not found
  • nodejs:开发并发布一个nodejs包
  • npx命令介绍
  • python3 使用 asyncio 代替线程
  • python学习笔记 - ThreadLocal
  • uni-app项目数字滚动
  • Vue.js源码(2):初探List Rendering
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 浮现式设计
  • 开源SQL-on-Hadoop系统一览
  • 一、python与pycharm的安装
  • 用element的upload组件实现多图片上传和压缩
  • 正则表达式小结
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • !$boo在php中什么意思,php前戏
  • #LLM入门|Prompt#3.3_存储_Memory
  • #控制台大学课堂点名问题_课堂随机点名
  • (2)(2.10) LTM telemetry
  • (Java)【深基9.例1】选举学生会
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转载)hibernate缓存
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .htaccess配置常用技巧
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net Redis的秒杀Dome和异步执行
  • .NET 中 GetProcess 相关方法的性能
  • @EventListener注解使用说明
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [20161101]rman备份与数据文件变化7.txt
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [CSS]盒子模型
  • [Excel] vlookup函数