Django多对多字段的更新和插⼊数据实例表的普通字段⼀对多字段多对多字段插⼊数据
#插⼊数据
def add(request):
G_title=('title')#-------值为:python书本
G_publish=('publish') #-------值为:1斯卡波罗集市歌词
给领导送礼
G_authors_list=list('authors')#-------值为:[3,7]
publish_obj=(id=G_publish)#查找Publish表对应id的obj
authors_obj_list=Author.objects.filter(id__in=G_authors_list)#查找Author表对应id的多个obj
title #-------普通字段
organization是什么意思
publish #-------⼀对多外键
authors #-------多对多外键brokeback mountain
book_obj=ate(title=G_title,publish=publish_obj)#添加普通和⼀对多外键的值
#添加多对多外键的值
⽅式⼀
book_obj.authors.add(*authors_obj_list)
⽅式⼆
for obj in authors_obj_list:
matchesbook_obj.authors.add(obj)
return redirect('/index/')
表的普通字段⼀对多字段多对多字段修改数据
def edit(request,b_id):#b_id-----为书本的id
G_title=('title')#-------值为:linux书本
G_publish = ('publish')#-------值为:2
G_authors_list = list('authors')#-------值为:[3,5]
book_obj = (id=b_id)#查找Book表要修改的id对象
publish_obj = (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 = (id=1)
b.author.all()
2.⼀个作者的所有书籍:
a = (id=1)
a.book_t.all()
3.给多对多的字段添加值(添加多对多关系):
从多对多字段中删除值(删除多对多关系):
可以看出这个blog_book_authors是根据多对多关系⾃动⽣成的关系表,但是如果我们想要搜集关于这个作者发布某⼀本书籍的时间额外增加⼀个字段,或者说与现有的系统集成,这个关系表已经存在了,那对于这样的情形,Django允许指定⼀个⽤于管理多对多关系的中间模型,然后就可以把这些额外的字段添加到这个中间模型中,具体的⽅法就是在ManyToMany字段中指定through参数指定作为中介的中间模型,修改上述models.py:
埃琳娜 吉尔伯特
查看⼀下此时的数据库表结构:
在创建BookAuthor类的最后使⽤了⾃定义的名称,这个也可以不⽤指定,系统可以⾃动⽣成表名
仔细观察BookAuthor这个类,也就是我们前⾯讲到的中间模型,同时我们看到在创建中间模型的时候我们创建了两个外键,这两个外键定义了两个模型之间是如何关联到⼀起的美国最好的大学
早餐的英文
所以当创建多对多关系模型的时候提倡使⽤through参数去指定并创建中间模型,这样⽐较⽅便我们进⾏字段的扩展
桀纣
那么此时我们⼜该如何添加和删除多对多关系呢?还能使⽤和刚刚相同的⽅法吗?
# 添加作者 ringo
ringo = ate(name='Ringo',email='')
# 添加作者paul
paul = ate(name='Paul',email='')
# 添加书籍 python book1
大学英语综合教程1book1 = ate(title='python book1')
# 给多对多添加值也就是添加多对多关系
m1 = BookAuthor(author=ringo,book=book)
# 第⼆种添加⽅式
m2 = BookAuthor.objects,create(author=paul,book=book1)
当我们使⽤多对多的中间模型之后,add(),remove(),create()这些⽅法都会被禁⽤,所以在创建这种类型的关系的时候唯⼀的⽅法就是通过创建中间模型的实例
以上这篇Django 多对多字段的更新和插⼊数据实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。