django学习笔记9一对多数据库操作增加create删除delete修改update多对多数据库操作增加(对象.表名.add)删除remove修改set([1,2,3])清空clear正反向基于对象的跨表查询(小写)基于双下划线的联表查询values
一对多数据库操作
增加create
#一对多的增删改查 #增加 #1.直接写实际的id,publish_id要存在! models.Book.objects.create(title:='呼啸山庄',price=123.34,publish_id=1) #2.对象传值,直接给book表中的publish对象传值,publish_id更换为publish对象! publish_obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.create(title:='武林外传',price=223.34,publish=publish_obj)
删除delete
#删除,所有关联的数据都没了! models.Publish.objects.filter(pk=3).delete()
修改update
#修改 #直接修改 models.Book.objects.filter(pk=1).update(publish_id=2) #修改对象 publish_obj = models.Publish.objects.filter(pk=1).first() models.Book.objects.filter(pk=1).update(publish=publish_obj)
多对多数据库操作
增加(对象.表名.add)
#多对多增删改查,authors理解为第三张表名(其实是自己创建的字段名) book_obj = models.Book.objects.filter(pk=1).first() print(book_obj.authors)#app01.Author.None print(book_obj.authors.all()) #<QuerySet [<Author:Author object (1)>,<Author:Author object (2)>]> #book obi.authors就能够直接进入第三张表 #增加add() #book obj.authors.add(3)#书籍d为1的书绑定了id为3的作者 book_obj.authors.add(1,2,3)#add括号内可以传多个参数,表示多个作者 #add也可以传递对象 author_obj1 = models.Author.objects.filter(pk=1).first() author_obj2 = models.Author.objects.filter(pk=2).first () author_obj3 = models.Author.objects.filter(pk=3).first() book_obj.add(author_obj1, author_obj2, author_obj3)
删除remove
#删除remove() #括号内既可以传数字,也可以传对象,并且支持多个 book_obj = models.Book.objects.filter(pk=1).first() book_obj.authors.remove(1)#取消id为1的书与id为1的作者的绑定关系 book_obj.authors.remove(1,2,3)#取消id为1的书与id为1.2.3的作者的绑定关系 author_obj1 = models.Author.objects.filter(pk=1).first() author obj2 = models.Author.objects.filter(pk=2).first() author_obj3 = models.Author.objects.filter(pk=3).first() book_obj.remove(author_obj1,author_obj2,author_obj3)
修改set([1,2,3])
#修改 #set()括号内必须传一个可迭代对象, #可迭代对象内部既可以传数字,也可以传对象,并且支持多个 book_obj models.Book.objects.filter(pk=1).first() #book obj.authors.set([1]) book_obj.authors.set([1,2,3]) author_queryset = models.Author.objects.all() book_obj.authors.set(author_queryset)
清空clear
#清空clear() #在第三张关系表中清空某个书籍与作者的绑定关系 book_obj = models.Book.objects.filter(pk=1).first() book_obj.authors.clear()
正反向
正向:外键字段在我手里,从我查你 反向:外键字段不在我手里,我查你
#多表查询 #子查询(基于对象的跨表查询) select * from publish where book id =(select id from book where id=1) #联表查询(基于双下划线的跨表查询) select book.name,publish.name from book inner join publish on book.publish_id=publish.id
基于对象的跨表查询(小写)
正向查询时,当结果会有多个的时候就需要加all()去查看,如果只有一个则直接拿到对象
#基于对象的跨表查询(子查询) #1.查询书籍主键为1的出版社,一对多 book_obj = models.Book.objects.filter(pk=1).first() #正向查询 res = book_obj.publish print(res) print(res.name) #北京出版社 #2.查询书籍主键为2的作者,多对多 book_obj = models.Book.objects.filter(pk=1).first() print(book_obj.authors.all()) #3.查询作者wuluo的phone author_obj = models.Author.objects.filter(name='wuluo').first() res = author_obj.author_detail print(res.phone)
反向查询,对象名小写,当你的结果有多个的时候需要通过对象.表名小写_set.all()方法查看 #如果结果只有一个,则可以直接通过对象.表名小写拿到
#5.查询作者为wuluo的书 author_obj = models.Author.objects.filter(name='wuluo').first() #获取多个对象要加all() res = author_obj.book_set.all() print(res) #6.查询地址是上海的作者 author_detail_obj models.AuthorDetail.objects.filter(addr='shanghai').first() #由于对象只有一个,不需要加_set.all() res = author_detail_obj.author print(res) print(res.name) #跨三表查询,查询作者详情id=1写的书 res = models.AuthorDetail.objects.filter(pk=1).first().author.book_set.all() print(res)
基于双下划线的联表查询values
正向: 外键字段__字段名 反向: 表名小写__字段名
#基于双下划线的跨表查询 #1.查询wuLuo的手机号 res = models.Author.objects.filter(name='wuluo').values('author_detail__phone') #查询wuLuo的手机号反向查询 models.AuthorDetail.objects.filter(author__name='wuluo').values('phone') print(res) #2.查询书籍主键为1的出版社名和书的名字 res = models.Book.objects.filter(pk=1).values('title','publish__name') #反向查询 res = models.Publish.objects.filter(book__id=1).values('name','book__title') print(res)
#3.查询书籍主键为2的作者名 res = models.Book.objects.filter(pk=2).values('authors__name') print(res)