表的普通字段 一对多字段 多对多字段 插入数据
#插入数据 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()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例
以上这篇Django 多对多字段的更新和插入数据实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]