django学习笔记9

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)

image-20230905203403824

删除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)

image-20230905233340642

#3.查询书籍主键为2的作者名
res = models.Book.objects.filter(pk=2).values('authors__name')
print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javatack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值