前言python
前言:北京生活好累,想把房子卖了带上本身喜欢的菇凉一块儿去旅游,但是房东不肯意啊,因此仍是学Django吧
aggreate聚合查询,结果是普通字典,queryset的结束符 from django.db.models import Avg,Max,Min,Count,Sum 求出孩子中间岁数最大的是谁 obj=models.Children.objects.all().aggreate(a=max('age')) print(obj) '结果': 4 Children.objects.aggregate(Avg('age'), Max('age'), Min('age'))
'分组查询: group by app01_children.wifes_id 每一个妻子生的最大的孩子 方式一: ret=models.Children.objects.values(childs_id).annotate(m=Max('age')) 总结: values写在annotate前面,意思是以values括号内的字段做为分组的依据,annotate里面是你要作的统计结果, 这样,返回结果为queryset类型数据,里面是字典{'childs_id':1,'m':3} 方式二: ret=models.Wife.objects.annotate(m=Max('children__age').values('m','name') 总结:annotate直接写下了objects后面,意思是按照前面表的全部数据(默认是id值)做为分组数据,结果返回的是前面这个表的全部models对象(model对象中包含了每一个对象本身的统计结果),在经过values来取值,取值时能够直接写字段和统计结果的别名,也是queryset类型,里面是字典{'m':1,'name':'熊一'} 放过胡斌 就来个图书馆管理系统吧 models.Book.objects.values('authors__name','authors__id').annotate(m=Max('price')) # group by authors__name,authors__id print(ret) ret = models.Author.objects.annotate(m=Max('book__price')).values('name','m') print(ret)
```python
查询结果是本表中两个字段的比较滞后符合条件的结果集
查询一下点赞数大于评论数的全部书籍
list1=[]
books=models.Book.objects.all()
for i in books:
if i.dianzan > i.comment:
list1.append(i)mysql
ret=models.Book.objects.filiter(dianzan__gt=F('comment')).values('title') '大于'
ret = models.Book.objects.filter(dianzan__lt=F('comment')).values('title') '小于
```sql
# 查询一下点赞大于300或者价钱小于300的书,Q的链接符:& -- and, |--or,~ -- not 取反 # ret = models.Book.objects.filter(Q(dianzan__gt=300)|~Q(price__lt=500),xx='oo').values('title') ret = models.Book.objects.filter(Q(dianzan__gt=300)).values('title') # # ret = models.Book.objects.filter(Q(Q(dianzan__gt=300)|~Q(price__lt=500))&Q(xx='oo')).values('title') # print(ret) Q查询可以进行各类复杂条件的拼接
# 方式1 # ret = models.Book.objects.raw('select * from app01_book;') # for i in ret: # print(i.title) # print(ret) #方式2 django自带的链接通道(配置的pymysql) from django.db import connection import pymysql # conn = pymysq.connect() # cursor = connection.cursor() # cursor.execute('select * from app01_book;') # print(cursor.fetchall()) # # 方式3 pymysql # conn = pymysql.connect( # host='127.0.0.1', # port=3306, # user='root', # password='123', # database='orm02', # charset='utf8' # # ) # cursor = conn.cursor(pymysql.cursors.DictCursor) # cursor.execute('select * from app01_book;') # print(cursor.fetchall())
锁: models.Book.objects.select_for_update().filter(id=1) 事务: 方式1 全局配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxshop', 'HOST': '127.0.0.1', 'PORT': '3306', 'USER': 'root', 'PASSWORD': '123', "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程中的sql } } 方式2: 视图函数加装饰器 from django.db import transaction @transaction.atomic def viewfunc(request): # This code executes inside a transaction. do_stuff() 方式3: 上下文加装饰器 from django.db import transaction def viewfunc(request): # This code executes in autocommit mode (Django's default). do_stuff() with transaction.atomic(): #保存点 # This code executes inside a transaction. do_more_stuff() do_other_stuff()