一、ORM查询
1.1配置环境
如果你向查看orm语句内部真正的sql语句有两种方式
1.如果是queryset对象 可以直接点query查看
2.配置文件settings中 直接配置
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, }}
django测试环境搭建 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings") import django django.setup() # 你就可以在下面测试django任何的py文件
1.2单表查询
必知必会13条
all() | 查询所有 |
filter() | 获取一个列表,里面是QuerySet对象 |
get() | 获取数据对象本身 |
first() | 拿第一个 |
last() | 那最后一个 |
exclude() | 除此之外 |
values() | 获取一个列表套字典,QuerySet对象 |
values_list() | 获取一个列表套元组,QuerySet对象 |
count() | 统计数据个数 |
distinct() | 去重(数据必须是一模一样) |
order_by() | 排序(默认是升序) |
reverse() | 反转(一定要先排序才能反转) |
exists() | 判断有没有数据 |
神奇的下划线查询
'''eg:res = models.Book.objects.filter(price__gt=200)'''
__gt 大于,__gte 大于等于
__lt 小于,__lte 小于等于
price__in=[12,25] 价格是12或者是25 ,__in 或者
price__rang=(12,25) 价格在12~25之间,顾头不顾尾。
#模糊匹配
__contains=x 包含x的
__icontains 忽略大小写
__startswith 以什么为开头
__endswith 以什么结束
__year 年,__month 月
1.3多对多字段的四个方法
#增 1.add() 括号内既可以传数字,也可以传数据对象,而且都支持一次性传多个 #改 2.set() 括号内既可以传数字,也可以传数据对象,而且都支持一次性传多个,但是括号内必须是可迭代对象 #删 3.remove() 号内既可以传数字,也可以传数据对象,而且都支持一次性传多个, #清空 clear() 括号内不需要传任何参数 直接清空当前对象所有的记录
4.跨表查询的规律
ORM跨表查询分为子查询和连表查询
查询又分为正反向查询:
外键字段在哪个表,从那个表出发查询就是正向查询,反之为反向查询
即外键在哪个表,谁就是正向查询,没有外键就是反向查询
***正向查询按字段***
***反向查询按表名小写***
# 1.基于对象的跨表查询>>>>子查询 # eg:查询书籍是python入门的出版社名称 book_obj = models.Book.objects.filter(title='python入门').first() # 正向查询按字段 print(book_obj.publish.name) """ 正向查询 按字段 当该字段所对应的数据有多个的时候 需要加.all() 否则点外键字段直接就能够拿到数据对象 """ #eg:查询出版社是东方出版社出版过的书籍 publish_obj = models.Publish.objects.filter(name='东方出版社').first() print(publish_obj.book_set) #出现 app01.Book.None,表示代码没问题,需要加.all() print(publish_obj.book_set.all()) """ 反向查询按表名小写 什么时候需要加_set 当查询的结果可以是多个的情况下 需要加_set.all() 什么时候不需要加_set 当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可 """ #eg:查询书籍是python入门的作者的手机号 book_obj = models.Book.objects.filter(title='python入门').first() print(book_obj.authors.all())
# 2.基于双下划綫的跨表查询>>>>连表查询 ''' 跨两张表查询: 正向查询:按关联字段+双下划线+要取的那张被关联表中的字段 反向查询:按表名小写+双下划线+要取的那张被关联表中的字段 ''' ''' 跨多表,连续跨 连续跨的操作的套路与两张表的一样,可以连续接n个双下划线,只需要在每次连双下划线时,确定是正向还是反向的 ''' ```
"""
left join
right join
inner join
union
"""
# 正向
models.Book.objects.filter(title='python').values('publish__name')
# 写外键字段publish之后 就会跨到publish表中 你想要该表的哪个字段对应的数据 就加__字段名获取
models.Book.objecst.filter(pk=1).values('authors__name')
models.Author.objects.filter(name='jason').values('author_detail__addr')
models.Publish.objects.filter(pk=1).values('book__title')
models.authors.objects.filter(pk=1).values('book__title')
models.AuthorDetail.objects.filter(pk=1).values('author__name')
# 反向
models.Publish.objects.filter(book__title='python').values('name')
"""查询书籍id为1 的作者的 手机号"""
models.Book.objects.filter(pk=1).values('authors__author_detail__phone')