Django微讲解(六)
外键字段的创建、外键字段操作、多表查询、基于对象的查询、基于双下划线的跨表查询、查看SQL语句
Django微讲解(六)
双下划线查询
# 1.查询年龄大于50的用户 res = models.Users.objects.filter(age__gt=50) ''' __gt:大于 __lt:小于 __gte:大于等于 __lte:小于等于 ''' # 2.查询年龄是18,28,38的用户 res = models.Users.objects.filter(age__in=[18,28,38]) # 3.查询年龄18到40之间的用户 res = models.Users.objects.filter(age__range=[18,50]) # 4.查询用户名中包含字母o的用户 res = models.Users.objects.filter(name__contains='o') # 区分大小写 res = models.Users.objects.filter(name__icontains='o') # 不区分大小写 # 5.查询月份是5月份的数据 res = models.Users.objects.filter(op_time__month=5) # 6.查询年份是22年的数据 res = models.Users.objects.filter(op_time__year=2022)
外键字段的创建
我们在讲数据库外键字段的时候,先讲了表与表之间的关系种类,一共有三种,分别是一对一、一对多、多对多的关系,然后我们 就可以根据这些关系来建立外键字段,一对多的关系我们就把外键字段建立在多得一方,多对多的关系我们就把外键建立在第三张关系表上, 一对一的关系外键可以建立在任意一张表上,推荐建立在使用频率较高的表上。 我们在models.py文件建立四张表,分别是图书表、出版社表、作者表和作者详情表,我们就以这四张表为例子来创建表关系。 1.书与出版社是一对多关系,书是多,出版社是一,Django ORM外键字段针对一对多关系也是建在多的一方,关键字是'ForeignKey' 示例:publish = models.ForeignKey(to='Publish') # 默认关联的就是主键字段 2.作者与作者详情是一对一关系,,Django ORM针对一对一关系建议外键字段建立在查询频率较高的表中,关键字是'OneToOneField' 示例:author_detail = models.OneToOneField(to='AuthorDetail') 3.书与作者是多对多的关系,Django ORM针对多对多关系,可以不要建立第三张关系表,关键字是'ManyToManyField' 示例:authors = models.ManyToManyField(to='Author') # 自动创建书和作者的第三张关系表 # 关键字 1.ManyToManyField:不会在表中创建实际的字段,而是告诉Django ORM自动创建第三张表 2.ForeignKey、OneToOneField:会在字段的后面添加_id后缀,如果你再定义模型类的时候自己添加了该后缀,那么在执行迁移命 令的时候还会再次追加_id,所以建议不要自己加 # 关键字的参数 to:用于指定跟哪张表有关系,自动关联主键 to_field:指定关联字段 to_fields:指定关联多个字段
外键字段操作
# 一对一、一对多外键字段操作 1.添加数据 方式一: models.Book.objects.create(title='cc',price=55555,publish_id=1) 方式二: obj = models.Publish.objects.filter(pk=1).first() models.Book.objects.create(title='zzz',price=5554.23,publish=obj) 2.修改数据 方式一: models.Book.objects.filter(pk=1).update(title='qqq') 方式二: obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.filter(pk=1).update(publish_id=obj) # 多对多字段操作 1.第三张关系表创建数据 obj = models.Book.objects.filter(pk=2).first() obj.authors.add(1 ) # 括号内支持传入多个参数,用逗号隔开即可,也可以放数据对象 2.第三张关系表修改数据 obj = models.Book.objects.filter(pk=2).first() obj.authors.set([2,]) # 括号内的参数必须是一个可迭代对象,里面的元素同样支持数据对象 3.第三张关系表删除数据 obj = models.Book.objects.filter(pk=2).first() obj.authors.remove(2) # 括号内的参数支持数据对象,同样支持多个 4.第三张关系表清空指定数据 obj = models.Book.objects.filter(pk=1).first() obj.authors.clear() # 括号内无需传值,直接清空当前表在第三张关系表中的绑定记录
多表查询
我们在讲述数据库的多表查询的时候,讲了两种方法,分别是子查询和连表查询,Django ORM本质上使用的还是上述两种方式,只 不过数据库的子查询是将SQL语句用括号括起来当做条件使用,Django ORM中是基于对象的跨表查询,数据库的连表查询是使用一些关键字把 所需要使用的表连成一张表然后操作,Django ORM连表操作是基于双下划线的跨表查询 # 正反向的概念 核心在于当前数据对象是否含有外键字段,有的话就是正向,没有就是反向 这个正反向查询是有一个口诀的,'正向查询按外键字段名,反向查询按表名小写'
基于对象的跨边查询
# 1.查询C++书籍对应的出版社 obj = models.Book.objects.filter(title='C++').first() res = obj.publish print(res) # 2.查询C++对应的作者 obj = models.Book.objects.filter(title='C++').first() res = obj.authors.all() print(res) # 3.查询作者oscar的详情信息 obj = models.Author.objects.filter(name='oscar').first() res = obj.author_detail print(res) # 4.查询aachubanshe出版的书籍 obj = models.Publish.objects.filter(name='aachubanshe').first() res = obj.book_set.all() print(res) # 5.查询oscar编写的书籍 obj = models.Author.objects.filter(name='oscar').first() res = obj.book_set.all() print(res) # 6.查询电话是111的作者 obj = models.AuthorDetail.objects.filter(phone=111).first() res = obj.author print(res)
基于双下划线的跨表查询
# 1.查询C++对应的出版社名称 res = models.Book.objects.filter(title='C++').values('publish__name') # 2.查询C++对应的作者姓名 res = models.Book.objects.filter(title='C++').values('authors__name') # 3.查询作者oscar的手机号和地址 res = models.Author.objects.filter(name='oscar').values('author_detail__phone','author_detail__addr') # 4.查询aachubanshe出版的书籍名称和价格 res = models.Publish.objects.filter(name='aachubanshe').values('book__title','book__price') # 5.查询oscar编写的书籍名称和日期 res = models.Author.objects.filter(name='oscar').values('book__title','book__publish_time') # 6.查询电话是111的作者的姓名 res = models.AuthorDetail.objects.filter(phone=111).values('author__name')
双下划线查询扩展
基于双下划线的跨表查询的结果也可以是完整的数据对象,我们不点手中有条件的表,直接点最终的目标数据对应的表 # 1.查询C++对应的出版社名称 res = models.Publish.objects.filter(book__title='C++') # 2.查询C++对应的作者姓名 res = models.Author.objects.filter(book__title='C++').values('name') # 3.查询作者oscar的手机号和地址 res = models.AuthorDetail.objects.filter(author__name='oscar').values('phone','addr') # 4.查询aachubanshe出版的书籍名称和价格 res = models.Book.objects.filter(publish__name='aachubanshe').values('title','price') # 5.查询oscar编写的书籍名称和日期 res = models.Book.objects.filter(authors__name='oscar').values('title','publish_time') # 6.查询地址是sh的作者的姓名 res = models.Author.objects.filter(author_detail__addr='sh').values('name') # 7.连续跨表操作,查询C++对应的作者地址 res = models.Book.objects.filter(title='C++').values('authors__author_detail__addr')
如何查看SQL语句
# 方式一 如果结果集对象是queryset,那么可以直接点query查看 # 方式二 配置文件固定配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } } 把上述代码放到settings文件夹,然后只要执行了ORM操作就会打印内部SQL语句
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!
__EOF__
本文作者:陆禄绯
本文链接:https://www.cnblogs.com/pyqsy/p/16282544.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/pyqsy/p/16282544.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix