标签:__ obj models django6 查询 filter objects
目录双下划线查询
# # 1.查询年龄大于20的用户
# res = models.User.objects.filter(age__gt=20)
"""
__gt 大于
__lt 小于
__gte 大于等于
__lte 小于等于
"""
# # 2.查询年龄是18、22、25的用户
# res = models.User.objects.filter(age__in=[18,22,25])
# # 3.查询年龄在18到26之间的用户
# res = models.User.objects.filter(age__range=(18,26)) # 包含18和26
# 4.查询姓名中包含字母j的用户
# res = models.User.objects.filter(name__contains='j')
# res = models.User.objects.filter(name__icontains='j')
'''
__contains区分大小写
__icontains忽略大小写
'''
# 5.其它方法补充
'''
__startwith 指定开头
__endswith 指定结尾
__regex 正则表达式
'''
# 6.查询月份是5月的数据
# res = models.User.objects.filter(op_time__mouth=5)
# 查询年份是22年的数据
# res = models.User.objects.filter(op_time__year=2022)
外键字段的创建
'''
MySQL复习
关系种类:
一对一
一对多
多对多
关系的判断:
a b两张表
a能有多个b则b为多
b能有多个a则a为多
eg:学生与班级 一对多 学生多 班级一
字段的位置
一对多的关系 外键字段在多的一方
一对一 外键推荐设在在查询频率高的一方
多对多 外键在第三方关系表中
'''
django中的orm
# 一对多关系 外键设在多的一方
modles.ForeignKey(to=关联表)
# 多对多关系中 外键在第三张表
modles.ManyToManyFild(to=关联表)
'''django 偶然吗外键字段针对多对多关系可以不用自己创建第三张表'''
# 一对一关系
modles.OneToOneField(to=)
'''django orm外键字段针对一对一关系 建在查询频率较高的表中'''
ForeignKey、OneToOneField会在字段的后面自动添加_id后缀 如果你在定义模型类的时候自己添加了该后缀那么迁移的时候还会再次添加_id_id 所以不要自己加_id后缀
外键字段操作
# 一对多、一对一外键操作
新增一本书:
modles.Book.object.create(title='政治',price=66.6,publish_id=4)
publish_obj=modles.Book.object.filter(pk=2)
modles.Book.object.create(title='政治',price=66.6,publish=publishobj)
修改表中信息:
modles.Book.object.filter(pk=2).update(publish_id=3)
# 多对多字段操作
1.第三张关系表创建数据
book_obj = models.Book.objects.filter(pk=1).first()
book_obj.authors.add()
括号内可以放主键值也可以放数据对象 并且都支持多个
2.第三张关系表修改数据
book_obj.authors.set()
括号内必须是一个可迭代对象 元素同样支持主键值或者数据对象
3.第三张关系表删除数据
book_obj.authors.remove()
括号内可以放主键值也可以放数据对象 并且都支持多个
4.第三张关系表清空指定数据
book_obj.authors.clear()
括号内无需传值 直接清空当前表在第三张关系表中的绑定记录
多表查询
"""
MySQL多表查询思路
子查询
将SQL语句用括号括起来当做条件使用
连表操作
inner join\left join\right join\union
django orm本质还是使用的上述两种方法
子查询>>>:基于对象的跨表查询
连表操作>>>:基于双下划线的跨表查询
"""
# 正反向概念
核心在于当前数据对象是否含有外键字段 有则是正向 没有则是反向
正向
eg:
由书籍查询出版社 外键字段在书籍表中 那么书查出版社就是'正向'
由书籍查询作者 外键字段在书籍表中 那么书查作者就是'正向'
反向
eg:
查询出版社出版的数据 外键字段不在出版社表 那么查书就是反向
基于对象的跨表查询
'''基于对象的跨表查询本质就是子查询'''
# 1.查询数据分析数据对应的出版社
book_obj = modles.Book.object.filter(title='数据分析').first()
由书籍查询出版社,正向
book_obj.publish
# 2.查询python全栈开发对应的作者
book_obj = models.Book.objects.filter(title='python全栈开发').first()
正向查询
book_obj.authors # app01.Author.None
book_obj.authors.all()
# 3.查询作者jason的详情信息
author_obj = models.Author.objects.filter(name='jason').first()
res = author_obj.author_detail
# 4.查询东方出版社出版的书籍
publish_obj = models.Publish.objects.filter(name='东方出版社').first()
反向查询 obj.表明小写_set
res = publish_obj.book_set.all()
# 5.查询jason编写的书籍
author_obj = models.Author.objects.filter(name='jason').first()
res = author_obj.book_set.all()
'''
正向查询
obj.外键字段名
反向查询
obj.表明小写_set
.all()当关联结果可能出现多个时使用all
'''
基于双下划线的跨表查询
'''基于双下划线的跨表查询本质就是连表操作'''
# 基于双下划线的跨表查询
'''手上有什么条件夏娜models点该条件对应的表名'''
# 1.查询数据分析书籍对应的出版社名称
models.Book.objects.filtter(title='数据分析').values('publish__name')
# 2.查询python全栈开发对应的作者姓名和年龄
models.Book.objects.filter(title='python全栈开发').values('authors__name','authors__age')
# 3.查询作者jason的手机号和地址
models.Author.objects.filter(name='jason').values('author_detail__phone','author_detail__addr')
# 4.查询东方出版社出版的书籍名称和价格
# 5.查询jason编写的书籍名称和日期
models.Author.objects.filter(name='json').values('book__title','book__publish_time')
# 6.查询电话是110的作者的姓名和年龄
models.AuthorDetail.objects..filter(phone=110),valuer('author__name','author__age')
双下划线查询拓展
"""基于双下划线的跨表查询的结果也可以是完整的数据对象"""
'''限制条件:手上有条件所在的表可以不被models点 直接点最终的目标数据对应的表'''
# 1.查询数据分析书籍对应的出版社名称
res = models.Publish.objects.filter(book__title='数据分析') # 结果是一个对象 <QuerySet [<Publish: 出版社对象:北方出版社>]>
res = models.Publish.objects.filter(book__title='数据分析').values('name')
# 2.查询python全栈开发对应的作者姓名和年龄
res = models.Author.objects.filter(book__name='python全栈开发').values('name','age')
# 3.查询作者jason的手机号和地址
res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','addr')
# 4.查询东方出版社出版的书籍名称和价格
res = models.Book.objects.filter(publish__name='东方出版社').values('title','price')
# 5.查询jason编写的书籍名称和日期
res = models.Book.objects.filter(authors__name='jason').values('title','publish_time')
# 6.查询电话是110的作者的姓名和年龄
res = models.Author.objects.filter(author_detail__phone=110).values('name','age')
# 连续跨表操作
查询python全栈开发对应的作者的手机号
models.Book.objecs.fiter(title='python全站开发').values('authors__author_detail__phone')
models.AuthorDetail.objects.filter(author__book__title='python全栈开发').values('phone')
'''
同时获取多张表中的数据
models.Book.objects.filter(title='python全栈开发').values('authors__author_detail__phone','authors__name','title')
'''
查看SQL语句
方式1:如果结果集对象是queryset 那么可以直接点query查看
方式2:配置文件固定配置
适用面更广 只要执行了orm操作 都会打印内部SQL语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
标签:__,obj,models,django6,查询,filter,objects 来源: https://www.cnblogs.com/mzzxlz/p/16282959.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。