Django 多对多字段的更新和插入数据实例


Posted in Python onMarch 31, 2020

表的普通字段 一对多字段 多对多字段 插入数据

#插入数据
def add(request):
 
 G_title=request.POST.get('title')#-------值为:python书本
 
 G_publish=request.POST.get('publish') #-------值为:1
 G_authors_list=request.POST.getlist('authors')#-------值为:[3,7]
 
 
 
 publish_obj=Publish.objects.get(id=G_publish)#查找Publish表对应id的obj 
 authors_obj_list=Author.objects.filter(id__in=G_authors_list)#查找Author表对应id的多个obj
 
 title  #-------普通字段
 publish  #-------一对多外键
 authors  #-------多对多外键
 
 book_obj=Book.objects.create(title=G_title,publish=publish_obj)#添加普通和一对多外键的值
 
 
 #添加多对多外键的值
 方式一
 book_obj.authors.add(*authors_obj_list)
 方式二
 for obj in authors_obj_list:
  book_obj.authors.add(obj)
 
 return redirect('/index/')

表的普通字段 一对多字段 多对多字段 修改数据

def edit(request,b_id):#b_id-----为书本的id
 
 G_title=request.POST.get('title')#-------值为:linux书本
 
 G_publish = request.POST.get('publish')#-------值为:2
 G_authors_list = request.POST.getlist('authors')#-------值为:[3,5]
 
 
 book_obj = Book.objects.get(id=b_id)#查找Book表要修改的id对象
 
 publish_obj = Publish.objects.get(id=G_publish)#查找Publish表对应id的obj
 author_objs = Author.objects.filter(id__in=G_authors_list)#查找Author表对应id的多个obj
 
 
 book_obj.title=G_title   #-------修改普通字段
 book_obj.publish=publish_obj #-------修改一对多字段
 book_obj.authors=author_objs #-------修改多对多字段 
 #注意:多对多字段 必须是.all()/.filter()等的查询集(QuerySet)
 book_obj.save()     #-------一定得save(),才能对数据库进行修改
 
 return redirect('/index/')

补充知识:Django的ManyToManyField(多对多)的使用以及through的作用

创建一个经典的多对多关系:一本书可以有多个作者,一个作者可以有多本书(如下)

Django 多对多字段的更新和插入数据实例

进行数据迁移,然后我们使用python manage.py sqlmigrate app(应用名) 迁移文件名 查看一下sql语句(如下):

Django 多对多字段的更新和插入数据实例

从图可以看出生成了三张表,一个是book(书籍)表包含id,title两个字段,一个是author(作者表)包含id,name,email三个字段,这是我们刚刚在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()

3.给多对多的字段添加值(添加多对多关系):

Django 多对多字段的更新和插入数据实例

从多对多字段中删除值(删除多对多关系):

Django 多对多字段的更新和插入数据实例

可以看出这个blog_book_authors是根据多对多关系自动生成的关系表,但是如果我们想要搜集关于这个作者发布某一本书籍的时间额外增加一个字段,或者说与现有的系统集成,这个关系表已经存在了,那对于这样的情形,Django允许指定一个用于管理多对多关系的中间模型,然后就可以把这些额外的字段添加到这个中间模型中,具体的方法就是在ManyToMany字段中指定through参数指定作为中介的中间模型,修改上述models.py:

Django 多对多字段的更新和插入数据实例

查看一下此时的数据库表结构:

Django 多对多字段的更新和插入数据实例

在创建BookAuthor类的最后使用了自定义的名称,这个也可以不用指定,系统可以自动生成表名

仔细观察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=book)
 # 第二种添加方式
 m2 = BookAuthor.objects,create(author=paul,book=book1)

当我们使用多对多的中间模型之后,add(),remove(),create()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例

以上这篇Django 多对多字段的更新和插入数据实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python学习资料
Feb 08 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
Python MD5加密实例详解
Aug 02 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
python 函数内部修改外部变量的方法
Dec 18 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
基于python爬取有道翻译过程图解
Mar 31 #Python
django实现将修改好的新模型写入数据库
Mar 31 #Python
Python urlencode和unquote函数使用实例解析
Mar 31 #Python
Python响应对象text属性乱码解决方案
Mar 31 #Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 #Python
Python super()方法原理详解
Mar 31 #Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 #Python
You might like
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
中文路径导致unitpngfix.js不正常的解决方法
2013/06/26 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
nodejs使用redis作为缓存介质实现的封装缓存类示例
2018/02/07 NodeJs
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
使用python实现扫描端口示例
2014/03/29 Python
使用Python对MySQL数据操作
2017/04/06 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
幼儿园元旦家长感言
2014/02/27 职场文书
妈妈活动方案
2014/08/15 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
三人合伙协议书范本
2014/10/29 职场文书
优秀班集体申报材料
2014/12/25 职场文书
学生检讨书怎么写
2015/05/07 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL