Django 多对多字段的更新和插入数据实例
作者:lmw1239225096 发布时间:2022-09-11 01:17:04
表的普通字段 一对多字段 多对多字段 插入数据
#插入数据
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的作用
创建一个经典的多对多关系:一本书可以有多个作者,一个作者可以有多本书(如下)
进行数据迁移,然后我们使用python manage.py sqlmigrate app(应用名) 迁移文件名 查看一下sql语句(如下):
从图可以看出生成了三张表,一个是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.给多对多的字段添加值(添加多对多关系):
从多对多字段中删除值(删除多对多关系):
可以看出这个blog_book_authors是根据多对多关系自动生成的关系表,但是如果我们想要搜集关于这个作者发布某一本书籍的时间额外增加一个字段,或者说与现有的系统集成,这个关系表已经存在了,那对于这样的情形,Django允许指定一个用于管理多对多关系的中间模型,然后就可以把这些额外的字段添加到这个中间模型中,具体的方法就是在ManyToMany字段中指定through参数指定作为中介的中间模型,修改上述models.py:
查看一下此时的数据库表结构:
在创建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()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例
来源:https://blog.csdn.net/lmw1239225096/article/details/78397847
猜你喜欢
- 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志
- 最近在做一个电信的MIS系统,由于数据库的数据量庞大(最少也有500万),发现了一个sql server 长时间占有内存的现象。当你查询数据
- 我就废话不多说了,直接上代码吧!import cv2import osdef save_img(): video_path =
- 本文实例讲述了PHP获取当前相对于域名目录的方法。分享给大家供大家参考。具体如下:http://127.0.0.1/dev/classd/i
- 一、yaml文件介绍yaml是一个专门用来写配置文件的语言。1. yaml文件规则区分大小写;使用缩进表示层级关系;使用空格键缩进,而非Ta
- 在IE浏览器调试代码,我们可以选择使用 IE WebDeveloper但是我个人用惯了ff浏览器下的firebug,所以在网上搜了一下,如果
- 判断一个数是否能被另一个整数整除是一个挺简单的问题,一般一个模运算就可以搞定了,懒惰的晓萌还是不想自己做,于是找到你帮他写代码,你就帮帮他吧
- 问题引入什么时候选择 T 作为参数类型,什么时候选择 *T 作为参数类型?[ ] T 是传递的指针还是值?选择 [ ] T 还是 [ ] *
- 由于工作对人的眼球和精神都会带来一定的疲劳,所以在界面设计中,希望用户能够准确的关注重要的信息,而不因为用户的长期使用而流失信息。最近在看《
- 使用python里的indexnums = [1, 2, 3, 4, 5, 6, 1, 9]print nums.index(max(num
- 1.在查询分析器理启动或停止SQL Agent服务启动:use mastergoxp_cmdshell 'net start SQL
- 环境:winxp sp2 ,mysql5.0.18,mysql odbc 3.51 driver 表采用 myisam引擎。access 2
- 前段时间自学了python,作为新手就想着自己写个东西能练习一下,了解到python编写爬虫脚本非常方便,且最近又学习了MongoDB相关的
- 一、软件测试大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件
- 正文之前前阵子做了个《人工智能》 的课程作业,然后写了个人工智障。。。大概就是个可以跟你下五子棋的傻儿子。。。下面是代码和效果正文 1、 摘
- 假如你正在运行使用MySQL的Web应用程序,那么你把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取
- 本文实例讲述了php+mysqli实现批量替换数据库表前缀的方法。分享给大家供大家参考。具体分析如下:在php中有时我们要替换数据库中表前缀
- 聚集索引,数据实际上是按顺序存储的,数据页就在索引页上。就好像参考手册将所有主题按顺序编排一样。一旦找到了所要搜索的数据,就完成了这次搜索,
- 问题你想读写一个二进制数组的结构化数据到Python元组中。解决方案可以使用 struct 模块处理二进制数据。 下面是一段示例代码将一个P