Django中的聚合/分组查询/F/Q查询/orm执行原生sql语句/ ORM事务和锁
Posted 熊华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中的聚合/分组查询/F/Q查询/orm执行原生sql语句/ ORM事务和锁相关的知识,希望对你有一定的参考价值。
前言:北京生活好累,想把房子卖了带上自己喜欢的菇凉一起去旅游,可是房东不愿意啊,所以还是学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)
F查询
```python ?
查询结果是本表中两个字段的比较滞后符合条件的结果集
查询一下点赞数大于评论数的所有书籍
list1=[]
books=models.Book.objects.all()
for i in books:
if i.dianzan > i.comment:
list1.append(i)
ret=models.Book.objects.filiter(dianzan__gt=F(‘comment‘)).values(‘title‘) ‘大于‘
ret = models.Book.objects.filter(dianzan__lt=F(‘comment‘)).values(‘title‘) ‘小于
```
Q查询
# 查询一下点赞大于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查询能够进行各种复杂条件的拼接
orm执行原生sql语句(了解)
# 方式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())
ORM事务和锁
锁:
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()
以上是关于Django中的聚合/分组查询/F/Q查询/orm执行原生sql语句/ ORM事务和锁的主要内容,如果未能解决你的问题,请参考以下文章
使用SQL语言了解Django ORM中的分组(group by)和聚合(aggregation)查询
python 之 Django框架(orm单表查询orm多表查询聚合查询分组查询F查询 Q查询事务Django ORM执行原生SQL)