一 创建多表

在models.py里创建4张表:Author(作者)、AuthorDetail(作者详细信息)、Publish(出版社)、Book(书)

四张表关系为:

(1)首先创建一对一关系。OneToOneField()

创建Author表

class Author(models.Model):

name=models.CharField( max_length=32)
age=models.IntegerField()
authorDetail=models.OneToOneField(to="AuthorDetail",to_field="id",on_delete=models.CASCADE)

models.OneToOneField是创建一对一关系的关键字,to="AuthorDetail"表示和AuthorDetail表创建一对一关系。to_field="id"表示关联字段,不写默认为Id(主键)。on_delete=models.CASCADE表示级联删除。(注:to后面的表名和字段都是字符串形式)。创建一对一关系,生成authorDetail,这个为关联属性。通过Author找AuthorDetail表中的内容就要通过这个关联属性。(生成一对一的表,会在关联的表生成字段:authorDetail_id)

(2)创建AuthorDetail表

class AuthorDetail(models.Model):
birthday=models.DateField(),
telephone=models.CharField(max_length=32) ,
addr=models.CharField( max_length=64)

(3)然后创建多对一关系。ForeignKey()

外键字段要加在多的一方,即Book表。

Book表和Publish通过ForeignKey连接起来,生成Publishs关联属性。

再建Publish表:

(4)建立多对多关系ManyToManyField

Book表和Author具有多对多关系。可以在任何一张表加。选择在Book表加:

(5)最后生成详细字段关系表

蓝色的只是类里面的关联属性,在表中没有这个字段,只有相应的id字段。

二 添加记录。

利用django的admin.py文件添加记录。

(1)首先在admin.py配置注册字段:

(2)在终端里输入:

Python manage.py createsuperuser创建超级用户

(3)在浏览器输入:http://127.0.0.1:8000/admin/登陆页面,和数据库同步,即可添加数据。

三 在视图函数中增删改查

1.增加

A.一对一

方式一:(常用)           通过id方式

先找到AuthorDetail中的那条记录,并生成obj对象。然后再创建Author记录时,让authorDetail_id=obj.id(Author表中有authorDetail_id字段的)

方式二:

首先创建好一个new_author_detail对象。然后创建Author记录时通过authorDetail等于该对象,就建立两者一对一关系。(不需要再查找一遍了)

B.一对多

方式一:(常用)(id连接)

同一对一增加一样。可以直接把Obj放在等式里。

方式二:(类属性连接)

C多对多

方式一(常用)

直接再Book表(关联表/有关联属性的)找到要添加的那条记录,然后调用Book的关联属性添加到指定的记录。

可以添加多个。方式为*[3,6]。里面的数字是id。

多对多(两张表的记录都已经存在,建立两者对应关系)

方式二:

先找到要添加的对象Book表的和Author表的。然后调用Book表的对象的author属性的add方法,添加Author表的对象。

2.删除

一对一和一对多的删除和单表删除是一样的。但要考虑级联删除。

级联删除原则:

我和你关联,你不能随便删-----------》你删我也删(级联)

我可以随便删,我删了对你没影响

(1)一对一

2是关联表中的内容,直接.deledte找到的记录,对被关联表没有影响。但1中删除了id为2 的记录,则在关联表中和id为2(即authorDetail_id=2)的记录也都删除了。(有关联id的那个值没了,这条id值对应的那条记录也没了)

(2)一对多

(3)多对多

多对多删除就是删除第三张表的两者对应关系

和add方法对应。通过类的关联属性增删。

set方法--------》先clear,再add

3.更新

(1)一对一

更新方法.update()前必须用filter()查找。不能用get().update()要用queryset对象。

(2)一对多

(3)多对多

Set方法

ORM多表增删改查的更多相关文章

  1. day 69 ORM 多表增删改查操作

    http://www.cnblogs.com/liwenzhou/p/8660826.html 下面的代码是在 python console中配置的. 关闭pycharm会消失. from app01 ...

  2. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  3. ORM之单表增删改查

    ORM之单表增删改查 在函数前,先导入要操作的数据库表模块,model from model所在的路径文件夹 import model   在views文件中,加的路径: #就一个app01功能的文件 ...

  4. GZFramwork数据库层《三》普通主从表增删改查

    运行结果: 使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model 生成器源代码下载地址: https://github.com/Gars ...

  5. GZFramwork数据库层《一》普通表增删改查

    运行结果:     使用代码生成器(GZCodeGenerate)生成tb_MyUser的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCode ...

  6. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  7. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  8. [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]

    [Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...

  9. GZFramwork数据库层《四》单据主从表增删改查

    同GZFramwork数据库层<三>普通主从表增删改查 不同之处在于:实例 修改为: 直接上效果: 本系列项目源码下载地址:https://github.com/GarsonZhang/G ...

随机推荐

  1. 利用python画出SJF调度图

    最先发布在csdn.本人原创. https://blog.csdn.net/weixin_43906799/article/details/105510046 SJF算法: 最短作业优先(SJF)调度 ...

  2. 【集群实战】inotify

    1. inotify简介 Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件). linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加 ...

  3. Vue项目中实现图片懒加载

    个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! ---对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面 ...

  4. XML--XML作用

    XML 把数据从 HTML 分离 如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML. 通过 XML,数据能够存储在独立的 XML 文件中.这样你就可以专注 ...

  5. poj1251 Jungle Roads Kruskal算法+并查集

    时限: 1000MS   内存限制: 10000K 提交总数: 37001   接受: 17398 描述 热带岛屿拉格里山的首长有个问题.几年前,大量的外援花在了村庄之间的额外道路上.但是丛林不断地超 ...

  6. String-StringBuilder-StringBuffer 的区别

    String StringBuilder StringBuffer 的区别 String:不可改变的字符串,不能够被修改                    (https://baijiahao.b ...

  7. bzoj 4152[AMPPZ2014]The Captain

    bzoj 4152[AMPPZ2014]The Captain 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. ...

  8. Python(Pyautogui 模块)

    1.安装 pyautogui 模块 pip install pyautogui 2.pyautogui 模块相关操作 鼠标操作 # 获取屏幕宽和高 w,h = pyautogui.size() # 在 ...

  9. muduo网络库源码学习————线程池实现

    muduo库里面的线程池是固定线程池,即创建的线程池里面的线程个数是一定的,不是动态的.线程池里面一般要包含线程队列还有任务队列,外部程序将任务存放到线程池的任务队列中,线程池中的线程队列执行任务,也 ...

  10. 【学习笔记】Shell-1 变量:命名规范、变量赋值/取值/取消、局部变量/全局变量、预设环境变量

    1.Shell变量 从变量的实质上来说,变量名是指向一片用于存储数据的内存空间. Shell变量是一种弱类型的变量,即声明变量时不需要指定其变量类型,也不需求遵循“先声明再使用”的规定,想用即可用. ...