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_id
    4. 一对多的表关系外键字段建立在多的一方
    5. 多对多的表关系无需类似于sql语句需要建立中间表, 会默认帮你创建虚拟的中间表
    6. 一对一, 多对多的表关系外键字段建立在查询频率较高的地方.

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

from django.db import models

class 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请求生命周期流程图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/130944.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一致性算法介绍(二)

1.4. NWR N :在分布式存储系统中,有 多少份备份数据 W :代表一次成功的更新操作要求至少有 w 份数据写入成功 R : 代表一次成功的读数据操作要求至少有 R 份数据成功读取 NWR值的不同组合会产生不同的一致性效果,当WR…

leetcode:141. 环形链表

一、题目 函数原型: bool hasCycle(struct ListNode *head) 二、算法 判断不是环形链表,只需遍历链表找到空结点即可。 判断是环形链表,由于链表是环形的,遍历不会永远不会结束。所以要设置快慢指针,慢指针一次走一步&…

解锁潜在商机的钥匙——客户管理系统公海池

在竞争激烈的市场环境下,企业需要更智能、高效的方式管理客户,从而挖掘潜在商机。客户管理系统的公海池,就是为此而生的利器,让你轻松解锁商机,提升客户管理效能。 公海池,打破信息孤岛,释放潜在…

最新itvboxfast源码如意itvbox影视仓二开会员版新增支持多线路仓库自动换源等功能支持对接苹果CMS和tvbox接口搭建教程

此套源码包含前后端源码,也有打包好的APK,不知道打包的也可以反编译,有视频教程 这次更新支持自动换源以及支持多线路仓库,首页轮播图优化,新增主题,积分签到还有很多新增功能,由于这里不能发太多详细的东…

新浪微博一键删除所有内容

亲自测试用 具体操作如下: 对应的 1 2 如下,进入这个界面是按F12 就可以看到 最后画横线的位置 替换自己的id 对应的就是 3 具体代码如下 //向删除接口发起请求,删除对应节点 function del_weibo(id) {var myHeaders new Headers();myHea…

Vuex:模块化Module

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。 这句话的意思是,如果把所有的状态都放在/src/store/index.js中,当项目变得越来越大的时候,Vue…

C#,数值计算——函数计算,Epsalg的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Convergence acceleration of a sequence by the algorithm.Initialize by /// calling the constructor with arguments nmax, an upper bound on the /// number of term…

软件工程的舞台上,《人月神话》的美学纷飞

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天给大家分享一本书&#xff1a;《人月神话》——软件工程的经典之作。 《人月神话》是一本具有深远影响力的软件工程著作&#xff0c;无论是软件开发者、管理者还是学习软件工程的人士&#xff0c;都能从中获得宝贵的启…

高性能网络编程 - 解读3种线程模型

文章目录 Pre线程模型1&#xff1a;传统阻塞 I/O 服务模型线程模型2&#xff1a;Reactor 模式Reactor 模式的基本设计思想Reactor 模式中的关键组成3种典型实现单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 小结 线程模型3&#xff1a;Proactor 模型 Pre 高性能网络…

深入理解 TCP;场景复现,掌握鲜为人知的细节

握手失败 第一次握手丢失了&#xff0c;会发生什么&#xff1f; 当客户端想和服务端建立 TCP 连接的时候&#xff0c;首先第一个发的就是 SYN 报文&#xff0c;然后进入到 SYN_SENT 状态。 在这之后&#xff0c;如果客户端迟迟收不到服务端的 SYN-ACK 报文&#xff08;第二次…

管易云与电商平台的无代码集成:实现API连接与用户运营

管易云简介及其与电商平台的合作 金蝶管易云是金蝶集团旗下以电商为核心业务的子公司&#xff0c;是国内最早的电商ERP服务商之一&#xff0c;总部在上海&#xff0c;与淘宝、天猫、 京东、拼多多、抖音等300多家主流电商平台建立合作关系&#xff0c;同时管易云是互联网平台首…

MATLAB中deconvwnr函数用法

目录 语法 说明 示例 使用 Wiener 滤波对图像进行去模糊处理 deconvwnr函数的功能是使用 Wiener 滤波对图像进行去模糊处理。 语法 J deconvwnr(I,psf,nsr) J deconvwnr(I,psf,ncorr,icorr) J deconvwnr(I,psf) 说明 J deconvwnr(I,psf,nsr) 使用 Wiener 滤波算法对…

操作系统 | 编写内核

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 操作系统实验之编写内核 1.1 实验目的 1.2 实验内容 1.3 实验步骤 1.4 实验过程 …

1.linux极速进阶

目录 概述文件相关vi文件编辑查找字符串查找某一行内容复制粘贴快速删除快速跳到文件首行和末行 进程相关ps/netstatjpstopkill linux三剑客grepsed添加方面操作删除方面替换操作 awk 结束 概述 身为后端开发&#xff0c;大数据平台搭建&#xff0c;对 linux 系统的操作最起码…

高阶组件和Hooks

目录 1. 高阶组件&#xff08;Higher-Order Components&#xff09; 1.1 创建高阶组件 1.2 使用高阶组件 2. Hooks 2.1 使用useState Hook管理状态 2.2 创建自定义Hook 结论 1. 高阶组件&#xff08;Higher-Order Components&#xff09; 高阶组件是一个接受一个组件作为…

面向对象--------三巨头

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ ა 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶个人主页&am…

Apache Airflow (四) :Airflow 调度shell命令

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

Unity 制作血量滑动条(Slider)

1.创建UI slider 层级面板点击右键-UI-slider 2.调整UI位置 选择2D视图&#xff0c;调整锚点和滑动条位置 3.PS中制作UI 导出2个图层&#xff0c;PNG格式。 4.改成精灵模式&#xff08;sprite2d&#xff09; 把两个PNG导入Unity仓库中&#xff0c;选中两个图&#xff0c;右…

【LeetCode刷题笔记】堆和优先级队列

358. K 距离间隔重排字符串 解题思路: 大根堆 + 队列 , 1)首先 计数数组 统计 每个字符出现的次数 ,然后将 计数 > 0 的 字符 和 次数 一起放入 大根堆 ,大根堆中

Matlab的多项式留数与极点的计算

Matlab的多项式留数与极点的计算 以下面的多项式为例&#xff1a; 运算代码&#xff1a; clc clear closesyms p % 定义多项式 Zp(5*p^571*p^370*p)/(2*p^635*p^4117*p^236); % 提取分子与分母 [I,D]numden(Zp); Idouble(coeffs(I,p,"All"));%分子 Ddouble(coeffs…