9.19总结
Posted tzz1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.19总结相关的知识,希望对你有一定的参考价值。
模型层
十三个方法
all() 查询所有结果
filter() 它包含了与所有给筛选条件相匹配的对象
get() 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有,都会抛出错误
exclude() 它包含了与所给筛选条件不匹配的对象
order_by() 对查询结果排序
reverse() 对查询结果反向排序,前面要先有排序才能反向
values() 返回一个ValuesQuerySet 一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
values_list() 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典劽
count() 返回数据库中匹配查询(QuerySet)的对象数量
exists() 如果QuerySet包含数据,就返回True,否则返回False
first() 返回第一条记录
last() 返回最后一条记录
distinct() 从返回结果中剔除重复记录
双下滑查询
"""
查看orm内部sql语句的方法有哪些
1.如果是queryset对象,那么可以点query直接查看该queryset的内部sql语句
2.在django项目的配置文件中,配置一下参数即可实现所有的orm在查询的时候自动打印对应的sql语句
LOGGING =
‘version‘: 1,
‘disable_existing_loggers‘: False,
‘handlers‘:
‘console‘:
‘level‘: ‘DEBUG‘,
‘class‘: ‘logging.StreamHandler‘,
,
,
‘loggersd‘:
‘django.db.backends‘:
‘handlers‘: [‘console‘],
‘propagate‘: True,
‘level‘: ‘DEBUG‘,
,
"""
# 查询价格大于200的书籍 # res = models.Book.objects.filter(price__gt=200) # print(res) # 查询价格小于200的书籍 # res = models.Book.objects.filter(price__lt=200) # print(res) # 查询价格大于等于200.22的书籍 # res = models.Book.objects.filter(price__gte=200.22) # print(res) # 查询价格小于等于200.22的书籍 # res = models.Book.objects.filter(price__lte=200.22) # print(res) # 查询价格要么是200,要么是300,要么是666.66 # res = models.Book.objects.filter(price__in=[200,300,666.66]) # print(res) # 查询价格在200到800之间的 # res = models.Book.objects.filter(price__range=(200,800)) # 两边都包含 # print(res) # 查询书籍名字中包含p的 """原生sql语句 模糊匹配 like % _ """ # res = models.Book.objects.filter(title__contains=‘p‘) # 仅仅只能拿小写p # res = models.Book.objects.filter(title__icontains=‘p‘) # 忽略大小写 # print(res) # 查询书籍是以三开头的 # res = models.Book.objects.filter(title__startswith=‘三‘) # res1 = models.Book.objects.filter(title__endswith=‘p‘) # print(res) # print(res1) # 查询出版日期是2017的年(******) res = models.Book.objects.filter(create_time__year=‘2017‘) print(res)
多表操作
图书管理系统表创建
一对多:ForeignKey
一对一:OneToOneField 可以同ForeignKey代替ForeignKey(unique=True)
上面两个关键字创建出来的字段会自动面上 _id 后缀
多对多:ManyToManyField
该字段并不会真正的在表中展示出来,它仅仅是一个虚拟字段
1.告诉orm自动创建第三种表
2.帮助orm跨表查询
一对多字段的增删改查
# 增 # publish_id传数字 # models.Book.objects.create(title=‘三国演义‘,price=189.99,publish_id=1) # publish直接传出版社对象 # publish_obj = models.Publish.objects.filter(pk=2).first() # models.Book.objects.create(title=‘红楼梦‘,price=999.99,publish=publish_obj) # 改 # 传数字的 # models.Book.objects.filter(pk=1).update(publish_id=3) # 传对象的 # publish_obj = models.Publish.objects.filter(pk=2).first() # models.Book.objects.filter(pk=1).update(publish=publish_obj) # 查 # 删 # models.Publish.objects.filter(pk=2).delete() # 默认都是级联更新 级联删除
多对多字段的增删改查
# 增 # 要给主键为1的书籍添加两个作者 # book_obj = models.Book.objects.filter(pk=1).first() # print(book_obj.authors) # 对象点击多对多虚拟字段 会直接跨到多对多的第三张表 # book_obj.authors.add(1) # book_obj.authors.add(2,3) # author_obj = models.Author.objects.filter(pk=1).first() # author_obj1 = models.Author.objects.filter(pk=2).first() # author_obj2 = models.Author.objects.filter(pk=3).first() # book_obj.authors.add(author_obj) # book_obj.authors.add(author_obj1,author_obj2) """ add() 是给书籍添加作者 括号内既可以传数字也可以传对象 并且支持一次性传多个 逗号隔开即可 """ # 改 # 将主键为1的书籍对象 作者修改为2,3 # book_obj = models.Book.objects.filter(pk=1).first() # book_obj.authors.set([2,]) # book_obj.authors.set([2,3]) # author_obj = models.Author.objects.filter(pk=1).first() # author_obj1 = models.Author.objects.filter(pk=2).first() # author_obj2 = models.Author.objects.filter(pk=3).first() # book_obj.authors.set([author_obj,]) # book_obj.authors.set([author_obj, author_obj1, author_obj2]) """ set()括号内 需要传一个可迭代对象 可迭代对象中 可以是多个数字组合 也可以是多个对象组合 但是不要混着用!!! """ # 删 # book_obj = models.Book.objects.filter(pk=1).first() # # book_obj.authors.remove(3) # book_obj.authors.remove(1,2) # author_obj = models.Author.objects.filter(pk=1).first() # author_obj1 = models.Author.objects.filter(pk=2).first() # author_obj2 = models.Author.objects.filter(pk=3).first() # book_obj.authors.remove(author_obj) # book_obj.authors.remove(author_obj1,author_obj2) """ remove()括号内既可以传数字 也可以传对象 并且支持传对个 逗号隔开即可 """ # 将某本书跟作者的关系全部清空 # book_obj = models.Book.objects.filter(pk=1).first() # book_obj.authors.clear() # 清空当前书籍与作者的所有关系 """ add() set() remove() 上面三个都支持传数字 或者对象 并且可以传多个 但是set需要传可迭代对象 clear() clear括号内不需要传任何参数 """
ORM跨表查询(*******)
基于对象的跨表查询
基于双下划线的查询
""" 正向与反向的概念 # 一对一 # 正向:author---关联字段在author表里--->authordetail 按字段 # 反向:authordetail---关联字段在author表里--->author 按表名小写 # 一对多 # 正向:book---关联字段在book表里--->publish 按字段 # 反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书 # 多对多 # 正向:book---关联字段在book表里--->author 按字段 # 反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书 正向查询按外键字段 反向查询按表名小写 """ """基于对象的跨表查询(子查询:将一张表的查询结果当做另外一个查询语句的条件)""" """ 强调:在书写orm语句的时候 跟写sql语句一样 不要尝试着 一次性写完 应该做到写一点看一点再一点 """
聚合查询
aggregate
# 1.统计所有书的总价格 # from django.db.models import Max,Min,Count,Avg,Sum # # # res = models.Book.objects.aggregate(Sum(‘price‘)) # res1 = models.Book.objects.aggregate(Avg(‘price‘)) # res2 = models.Book.objects.aggregate(Count(‘price‘)) # res3 = models.Book.objects.aggregate(Max(‘price‘)) # res4 = models.Book.objects.aggregate(Min(‘price‘)) # res5 = models.Book.objects.aggregate(Max(‘price‘),Min(‘price‘),Count(‘pk‘),Avg(‘price‘),Sum(‘price‘)) # print(res5) # print(res) # print(res1) # print(res2)
分组
annotate
# 统计每一本书的作者个数 from django.db.models import Max, Min, Count, Avg, Sum # res = models.Book.objects.annotate(author_num = Count(‘authors‘)).values(‘author_num‘,‘title‘) # print(res) # 统计出每个出版社卖的最便宜的书的价格 # res = models.Publish.objects.annotate(mmp = Min(‘book__price‘)).values(‘name‘,‘mmp‘) # print(res) # 统计不止一个作者的图书 # res = models.Book.objects.annotate(author_num=Count(‘authors‘)).filter(author_num__gt=1) # print(res) """ 只要是queryset对象 就可以无限制的调用queryset对象的方法!!! 最最常用的就是对一个已经filter过滤完的数据 再进行更细化的筛选 """ # 查询各个作者出的书的总价格 # res = models.Author.objects.annotate(sp=Sum(‘book__price‘)).values(‘name‘,‘sp‘) # print(res)
F与Q查询
F查询
#F查询的本质就是从数据库中获取某个字段的值 # 查询库存数大于卖出数的书籍 """之前查询等号后面的条件都是我们认为输入的 现在变成了需要从数据库中获取数据放在等号后面 """ from django.db.models import F # res = models.Book.objects.filter(kucun__gt=F(‘maichu‘)) # print(res) # 将书籍库存数全部增加1000 # models.Book.objects.update(kucun=F(‘kucun‘)+1000) # 把所有书名后面加上‘新款‘ # from django.db.models.functions import Concat # from django.db.models import Value # # ret3 = models.Book.objects.update(title=Concat(F(‘title‘), Value(‘新款‘))) # models.Book.objects.update(title = F(‘title‘)+‘新款‘) # 不能这么写
Q查询
from django.db.models import Q # 查询书籍名称是三国演义或者价格是444.44 # res = models.Book.objects.filter(title=‘三国演义‘,price=444.44) # filter只支持and关系 # res1 = models.Book.objects.filter(Q(title=‘三国演义‘),Q(price=444)) # 如果用逗号 那么还是and关系 # res2 = models.Book.objects.filter(Q(title=‘三国演义‘)|Q(price=444)) # res3 = models.Book.objects.filter(~Q(title=‘三国演义‘)|Q(price=444)) # print(res2) # Q高级用法 q = Q() q.connector = ‘or‘ # 修改查询条件的关系 默认是and q.children.append((‘title__contains‘,‘三国演义‘)) # 往列表中添加筛选条件 q.children.append((‘price__gt‘,444)) # 往列表中添加筛选条件 res = models.Book.objects.filter(q) # filter支持你直接传q对象 但是默认还是and关系 print(res)
以上是关于9.19总结的主要内容,如果未能解决你的问题,请参考以下文章