创建一张作者表,author,创建外键与book表,多对多关系 ,外键字段放在那张表都可以,

class Author(models.Model):name = models.CharField(max_length=32)#在Author表中创建第三张表,与book表创建多对多关系一样的效果# books = models.ManyToManyField(Book)#再重新生成数据库,因为新增了多对多关系,book表会新增字段,所以直接重新生成数据库就会报错,

在book表里,关联Author表,Author就要放在book表上面,关联的表Author加上引号是字符串,是一个查询过程,等加载完,找Author,就可以在全局找到,

不加引号,就要把Author表放在book表上面

在book表中,创建与author表多对多的关系
class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=5 , decimal_places=2)#书籍与出版社是一对多,书是多,出版社是一,外键(子表)建在多的表中,#publish 作为一个外键 与Book 表建立一对多关系,默认绑定到Book 的主键id上publish = models.ForeignKey(Publish,)

然后生成数据库,注意:如果book表中有数据,直接生成数据,就会报错,因为book表会新增一个author_id 字段,而原来的book表中的数据没有改字段,所以会报错,删除book表中的数据

执行命令  python manage.py  makemigrations   ,python manage.py migrate,

在数据库会发现新增一张表,book_author,是第三张表  ,一个主键,2个外键,是django自动创建的,现在就可以添加书籍

在创建的表里,手动插入数据,,然后绑定book与author的多对多关系,

在views视图函数中,,先获取Book表的一个book对象,查看该book关联的作者,就是book_obj.authors.all(),

id =1的这本书,如果没有关联的作者,返回None,如果有作者,就返回一个对象集合,QuerySet数据类型,里面包含了关联的作者对象

#给第三张表添加关系,#看下authors对象
book_obj = Book.objects.get(id=1)#获取一个书籍的对象,有可能是多个作者写的,是一个集合对象,#获取id=1 这本书的作者集合对象,类似列表结构print(book_obj.authors) #gu_orm.Author.None ,是id=1的这本书,没有作者,所以得到一个None,-----------------------------#如果给Book和author绑定了关系,添加值,就会得到一个Queryset集合,print(book_obj.authors.all())#< QuerySet[ < Author: egon >, < Author: alex >, < Author: yuan >] >---------------------------------------

---------------

方法1:多对多关系的创建,获取一个个对象,添加

现在用代码实现多对多关系的创建

先删除原第三张表的数据,

步骤1 ,先得到一个Book对象

book_obj = Book.objects.get(id=1)#获取一个书籍的对象,有可能是多个作者写的,是一个集合对象,

步骤2 :获取1个或2个以上author对象

 author1 = Author.objects.get(id=1)author2 = Author.objects.get(id=2)

步骤3: 把author1,和author2 添加到 book_obj 对象中,使用add方法,书对象关联的作者表,添加2个作者对象

#book表与author表绑定关系,把2个作者对象添加到,关联到Book对象book_obj.authors.add(author1,author2)

然后再执行url,刷新数据库

===

方法2:多对多关系的创建,获取所有的对象集合,添加 ,记得用 * 号,把列表拆开,一个个的获取对象

 先获取一个book对象,book_obj = Book.objects.get(id=1)

#方法2 ,把所有的author加到book对象中author_list = Author.objects.all()book_obj.authors.add(*author_list)

=====解除关联关系clear()清除所有的关系 ,remove()删除指定的关系
    #解除关联关系book_obj.authors.clear()#解除了书与作者的所有关系,#指定删除Book与作者的关系,先获取要解除关联的对象,然后用remove的方法,author = Author.objects.get(name = 'alex')book_obj.authors.remove(author)

----

级联删除,删除一个对象,相关联的一对多,多对多关系都会删除,delte()

book_obj.delete()

----manytomany 是django自己会生成第三张表,自己手动也可以创建第三张表
#    manytomany,会自动生成第三张表,现在自己可以手动创建第3张表,class book2author(models.Model):book = models.ForeignKey("Book")author = models.ForeignKey("Author")

数据库中就多出book2author这张表

在views视图函数添加一条记录
    #----给自己手动创建的第三张添加记录,实列化对象,用save保存b2a = book2author(book_id=2,author_id=1)#括号里面可以写集合,作者的集合对象,进行关联,
    b2a.save()return HttpResponse('ok')

 
#方法2 ,把所有的author加到book对象中author_list = Author.objects.all()book_obj.authors.add(*author_list)

转载于:https://www.cnblogs.com/gyh04541/p/7912867.html

django 多对多表的创建,级联删除,手动创建第三张表相关推荐

  1. 多对多关系需要建立中间表_【数据库基础】为什么需要三张表之多对多表结构设计...

    了解完一对一和一对多表结构设计,接下来一起了解一下多对多的表结构设计. 同样,咱们先来想一般什么场景需要用到多对多.假如说咱们有一个叫订单和一个叫商品的这两张表,这两张表的关系,它其实就是一个多对多的 ...

  2. php中rbac三张表的关系,财务人不可不知的三张表的关系

    原标题:财务人不可不知的三张表的关系 本文节选自<世界500强CFO的财务管理笔记>,作者郑永强资产负债表.利润表.现金流量表是三张最基本也是最重要的财务报表.这三者之间究竟是怎样的关系呢 ...

  3. Oracle 创建视图、修改表的约束 创建级联删除触发器、存储过程

    1.创建视图 创建航班表的视图,用于查询航班表的所有信息 create or replace view F_view as select * from Flight; 创建机票表的视图,用于查询机票表 ...

  4. android手动创建数据表,Android开发—数据库应用—手动创建(SQLite)数据库--手动创建数据表(table)...

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:数据库应用-手 ...

  5. 【clickhouse】创建物化视图数据来源是两张表该怎么写创建语句呢?

    1.概述 创建物化视图数据来源是两张表该怎么写创建语句呢 CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name ...

  6. mysql创建三张表的视图_mysql三张表连接建立视图

    三张表连接·· A表的a字段 对应 B表的b字段 ,B表的b1字段对应C 表的c字段 现在 建立 一个视图,可以同时 看到三张表的 所有信息·~ create or replace view v_na ...

  7. mysql同步三张表如何用事务_MySQL 多表查询与事务的操作

    表连接查询 什么是多表查询 # 数据准备 # 多表查询的作用 * 比如:我们想查询孙悟空的名字和他所在的部门的名字,则需要使用多表查询 # 如果一条 SQL 语句查询多张表,因为查询结果在多张不同的表 ...

  8. Mysql数据库使用:学生选课系统,其中设计到三张表,分别为学生表,课程表,学生和课程对应的关联表。

    Mysql数据库使用 练习内容:主要针对学生选课系统而设计,其中设计到三张表,分别为学生表,课程表,学生和课程对应的关联表. 学生表主要用于存储学生信息,包括姓名,性别,地址,电话等信息 课程表主要用 ...

  9. HCNP——OSPF的Router-ID和OSPF的三张表

    一.Router-ID OSPF Router-ID是一个32bit长度的数值,通常使用点分十进制的形式表现,用于在OSPF域中唯一地标识一台OSPF路由器.我们把一系列连续地OSPF路由器组成地网络 ...

最新文章

  1. 转型中的知不知、能不能、愿不愿
  2. 企业网络推广——企业网络推广公司解读企业新站沙盒期如何优化?
  3. Leetcode 1 Two Sum
  4. 多态基类与虚析构函数
  5. POJ 2492 A Bug's Life 带权并查集
  6. 【易创课堂】第2期开课啦,大包新年好礼成都等你
  7. 监控工具之zabbix server3.4 部署配置
  8. linux 内核 性能,Linux内核十个版本性能对比
  9. patricia tree_前5名:专访Patricia Torvalds和Ada Initiative,印度采用开源,等等
  10. 能够让机器狗学会灭火, ModelArts3.0让AI离我们又近一步
  11. Servlet 环境设置
  12. Tip:部署sharepoint2013SP1指定SQL数据库时的小细节
  13. 腾讯微博qq说说备份导出工具_曾经比微信还火,3亿人用过的腾讯软件,如今彻底凉了...
  14. 任何进行推理的系统都必须具有一些基本的智能
  15. Request method XXX not supported
  16. Theorem、Proposition、Lemma和Corollary等的解释与区别
  17. one 主格 复数 宾格_代词专练(名词性物主代词,形容词性物主代词,宾格,主格,复数)...
  18. 鸿蒙系统会碎片化吗,鸿蒙系统讲解决安卓碎片化问题,4G流畅度媲美12G!
  19. python字母对应数字上海迪士尼残疾人门票_所有景点提供无障碍设施 残障人士也能玩转上海迪士尼...
  20. 递归算法转化为非递归算法

热门文章

  1. 《消逝的光芒》为何能成为Steam热销榜常客 ?
  2. Unity VS Unreal,游戏开发该如何选择引擎?
  3. GameMaker Studio 之中的攻击与受击判定盒
  4. 限时领取!CSDN夏日惊喜礼包上线啦~
  5. 入职体检——项目列表(12项)
  6. mysql 如何清除sql缓存
  7. TermServDevices错误的解决方案
  8. Oracle truncate table 与 delete tabel的区别(转)
  9. DRF (Django REST framework) 框架介绍
  10. PHP中被忽略的性能优化利器:生成器