Django微讲解(六)

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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   陆禄绯  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示