Django(七)

外键字段的增删改查

# 前期数据表准备 # 以图书 出版社 作者 作者详情表为例 # 1. 针对一对多,一对一 # 增加数据,增加一本书 # models.Book.objects.create(title='西游记', price=100, publish_time='2022-02-01', publish_id=1) # 先查询出你要添加的出版社对象 # publish_obj = models.Publish.objects.filter(pk=2).first() # models.Book.objects.create(title='西游记1', price=100, publish_time='2022-02-01', publish=publish_obj) # 第二种方式 # book_obj = models.Publish.objects.filter(pk=2).first() # book_obj.publish.add(1) # 2. 改 # models.Book.objects.filter(pk=1).update(publish_id=2) # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.publish) # # publish_obj = models.Publish.objects.filter(pk=1).first() # models.Book.objects.filter(pk=1).update(publish=publish_obj) # 针对多对多 # 给一本书添加多个作者 book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.authors) # app01.Author.None # print(book_obj.authors.all()) # app01.Author.None # 增加 # book_obj.authors # 代表已经到第三张表了 # book_obj.authors.add(1) # 支持对象 # author_obj1 = models.Author.objects.filter(pk=1).first() # author_obj2 = models.Author.objects.filter(pk=2).first() # book_obj.authors.add(1, 2) # book_obj.authors.add(author_obj1, author_obj2) # 改 # book_obj.authors.set([3, 2]) # book_obj.authors.set([author_obj1, author_obj2]) # 删除 book_obj.authors.remove(2) # 清空 book_obj.authors.clear()

正反向查询

正向查询 反向查询 ''' 外键字段在我手上,我查你就是正向 外键字段不再我手上,我查你就是反向 ''' eg: book >>> publish # 正向 publish >>> book # 反向 author >>> book # 反向 book >>> author # 正向 在多表查询的时候,按照正反向查询口诀 ''' 1. 正向查询按照字段(外键字段) 2. 反向查询按照表名小写或者表名小写_set.all() '''

基于对象的跨表查询(子查询)

###############################跨表查询########################################### # 1. # 查询书籍主键为1的出版社 # 书 >>> 出版社 >>> 正向 # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj) # print(book_obj.publish) # 代表的是出版社对象 # print(book_obj.publish.name) # print(book_obj.publish.addr) # 2. # 查询书籍主键位1的作者 # book >>> author >>> 正向 # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.authors) # app01.Author.None # print(book_obj.authors.all()) # app01.Author.None # for author_obj in book_obj.authors.all(): # print(author_obj.name) # 3. # 查询tom的手机号 # 作者 >>> 作者详情 >>> 正向 # author_obj = models.Author.objects.filter(name='tom').first() # print(author_obj.author_detail) # print(author_obj.author_detail.phone) # 4. # 查询东京出版社出版的书籍 # 出版社查书 >>> 反向 # publish_obj = models.Publish.objects.filter(name='东京出版社').first() # print(publish_obj.book_set) # app01.Book.None # print(publish_obj.book_set.all()) # app01.Book.None # for book_obj in publish_obj.book_set.all(): # print(book_obj.title) # 5. # 查询tom写过的书 # 作者查书 >>> 反向 author_obj = models.Author.objects.filter(name='tom').first() print(author_obj.book_set.all()) # 6. # 查询手机号是120的作者姓名 # 作者详情查作者信息 >>> 反向 author_detail_obj = models.AuthorDetail.objects.filter(phone=120).first() print(author_detail_obj.author) # ''' 总结: 反向查询只要查询出的结果可能有多个的时候,都要加上 表名_set.all() 如果查询出来的结果是一个,就不用加_set,直接使用表名小写 '''

基于双下划线的跨表查询

# 1. # 查询书籍主键为1的出版社名称和书籍名称 ''' 正反向查询的概念同样适用 ''' # res = models.Book.objects.filter(pk=1).values('title', 'publish__name') # print(res) # 2. # 查询书籍主键位1的作者名称 # res = models.Book.objects.filter(pk=1).values('authors__name') # print(res) # 3. # 查询tom的手机号 # res = models.Author.objects.filter(name='tom').values('author_detail__phone') # print(res) # 4. # 查询东京出版社出版的书籍 # res = models.Publish.objects.filter(name='东京出版社').values('book__title') # print(res) # 5. # 查询tom写过的书 # res = models.Author.objects.filter(name='tom').values('book__title') # print(res) # 6. # 查询手机号是120的作者姓名 # res = models.AuthorDetail.objects.filter(phone=120).values('author__name') # print(res) # 7. # 查询书籍主键位1的作者的手机号 # book author author_detail res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone') print(res)

F查询和Q查询

# F查询 可以拿到数据库中原有的数据 # 1. 把书籍的价格在原来的基础之上加100元 book update book set price = price + 100 where id=1; # F查询 # 1. 把书籍的价格在原来的基础之上加100元 ''' 一般来说,跟数据相关的模块要么在django.db,要么在django.db.models ''' from django.db.models import F ''' F查询默认是对数字类型的''' # models.Book.objects.update(price=F('price')+100) from django.db.models.functions import Concat from django.db.models import Value # 2. # models.Book.objects.update(title=Concat(F('title'), Value('东京出版社'))) # Q查询 # 1. 查询书籍价格大于等于300的或者id=1的数据 # sql: select * from t where price >= 300 or id=1 # orm: from django.db.models import Q # res=models.Book.objects.filter(Q(price__gte=300), Q(id=1)) # 逗号分隔,还是and关系 # res=models.Book.objects.filter(Q(price__gte=300)| Q(id=1)) # |分隔,还是or关系 # res=models.Book.objects.filter(~Q(price__gte=300)| ~Q(id=1)) # ~分隔,取反 # print(res) # q = 'price'

__EOF__

本文作者祈安
本文链接https://www.cnblogs.com/jyc666/p/16095696.html
关于博主:没有收拾残局的能力,就别放纵善变的情绪
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   丶祈安  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示