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面向对象编程中的类和对象学习教程
Mar 30 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
python 将print输出的内容保存到txt文件中
Jul 17 Python
python3.6+selenium实现操作Frame中的页面元素
Jul 16 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
Python实现像awk一样分割字符串
Sep 15 Python
Python实现冒泡排序算法的完整实例
Nov 04 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 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遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
Python中无限元素列表的实现方法
2014/08/18 Python
Python可跨平台实现获取按键的方法
2015/03/05 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
Python实现FM算法解析
2019/06/18 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
python双向链表原理与实现方法详解
2019/12/03 Python
Tensorflow 多线程设置方式
2020/02/06 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
python drf各类组件的用法和作用
2021/01/12 Python
英国大码女性时装零售商:Evans
2018/08/29 全球购物
什么时候需要进行强制类型转换
2016/09/03 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
卖车协议书
2014/04/21 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
祝寿主持词
2015/07/02 职场文书
心得体会格式及范文
2016/01/25 职场文书
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技