Django的ManyToManyField(多对多)中的through的作用
创建一个经典的多对多关系:一本书可以有多个作者,一个作者可以有多本书(如下)
运行“python manage.py makemigratons"和"python manage.py migrate”进行数据迁移之后,
会生成三张表,一个是book(书籍)表包含id,title两个字段,一个是author(作者表)包含id,name两个字段,这是我们刚刚在models.py文件中创建两个模型,但是有一点需要注意的是在book表里面没有我们创建的authors表,而是多了一个book_authors表,在这张表里面又多了两个字段book_id,author_id,其实这个第三张表就是用来存放书籍和作者之间映射关系的中间表
那么我们如何进行数据的查询呢?
1.一本书的所有作者
b = Book.objects.get(id=1) #拿到具体哪本书
b.author.all()
2.一个作者的所有书籍:
a = Author.objects.get(id=1)
a.book_set.all() #反向查询
但是如果我们想要搜集关于这个作者发布某一本书籍的时间额外增加一个字段,或者说与现有的系统集成,这个关系表已经存在了,那对于这样的情形,Django允许指定一个用于管理多对多关系的中间模型,然后就可以把这些额外的字段添加到这个中间模型中,具体的方法就是在ManyToMany字段中指定through参数作为中介的中间模型,修改上models.py:
仔细观察BookAuthor这个类,也就是我们前面讲到的中间模型,同时我们看到在创建中间模型的时候我们创建了两个外键,这两个外键定义了两个模型之间是如何关联到一起的, 所以当创建多对多关系模型的时候提倡使用through参数去指定并创建中间模型,这样比较方便我们进行字段的扩展
那么此时我们又该如何添加和删除多对多关系呢?还能使用和刚刚相同的方法吗?
# 添加作者 ringo
ringo = Author.objects.create(name='Ringo',email='ringo@qq.com')
# 添加作者paul
paul = Author.objects.create(name='Paul',email='paul@qq.com')
# 添加书籍 python book1
book1 = Book.objects.create(title='python book1')
# 给多对多添加值也就是添加多对多关系
m1 = BookAuthor(author=ringo,book=book1)
# 第二种添加方式
m2 = BookAuthor.objects,create(author=paul,book=book1)
当我们使用多对多的中间模型之后,add(),remove(),create()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例
Django的ManyToManyField(多对多)中的through的作用的更多相关文章
- Django之ORM多对多表创建方式,AJAX异步提交,分页器组件等
MTV与MVC MTV模型: M:模型层(models.py),负责业务对象和数据库关系的映射(ORM) T:模板层(Template),负责如何把页面展示给用户(HTML) V:视图层( ...
- 数据库开发-Django ORM的多对多查询
数据库开发-Django ORM的多对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...
- Django聚合与分组查询中value与annotate的顺序问题
在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论: 结论 value在annotate前面时 ...
- {Django基础六之ORM中的锁和事务}一 锁 二 事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- day 71 Django基础六之ORM中的锁和事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update(no ...
- reverse(两种反向生成url django原生形式和rest_framework中版本的形式)
reverse(两种反向生成url django原生形式和rest_framework中版本的形式) views.py from django.shortcuts import render,Http ...
- Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法
Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...
- day 58 Django基础六之ORM中的锁和事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...
随机推荐
- [转帖]拿小本本记下的Linux Shell常用技巧(一)
拿小本本记下的Linux Shell常用技巧(一) https://zhuanlan.zhihu.com/p/73361101 一. 特殊文件: /dev/null和/dev/tty Linux系统提 ...
- Docker 部署Jira8.1.0
Jira与Confluence一样,都需要用到独立的数据库,对于数据库的安装我们不做介绍,主要介绍如何用Docker部署Jira以及对Jira进行破解的操作. 1.数据库准备 关于数据库官方文档说明: ...
- Java 语言 ArrayList 和 JSONArray 相互转换
Java 语言 ArrayList 和 JSONArray 相互转换 本篇主要讲解 ArrayList 和 fastjson 中的 JSONArray相互转换的几种常用方式,以实体类 Student. ...
- Python print函数详解
1 """ 2 print(...) 3 print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fals ...
- pandas之数据IO笔记
pandas在进行数据存储与输出时会做一些相应的操作 1.*索引:将一个列或多个列读取出来构成DataFrame,其中涉及是否从文件中读取索引以及列名 2 *类型推断和数据转换:包括用户自定义的转换以 ...
- PHP7有没有你们说的那么牛逼
男人不能快,但程序一定要快.PHP7到底快不快,我们拭目以待. PHP7来一发 PHP7正式发布到现在已经一年半了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍, ...
- 一文搞懂嵌入式uboot、kernel、文件系统的关系
总览: 在linux系统软件架构可以分为4个层次(从低到高分别为): 1.引导加载程序 引导加载程序(Bootloader)是固化在硬件Flash中的一段引导代码,用于完成硬件的一 ...
- Linux文件删除,但是df -hT之后磁盘空间没有释放
Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放. 查找了下发现系统对rm进行了alias ,因为Linux对删除操作没有回收站机制,对rm操作进行了自定义,对删除 ...
- sit、qas、dev、pet
SIT: System Integrate Test 系统整合测试 QAS: Quality Assurance system 质量保证 DEV: Development 开发 PET: Perfor ...
- (六)springmvc之ModelAndView、Model、Map、ModelMap
<a href="<%=request.getContextPath()%>/responseData/response_1">使用原生的作用域</a ...