Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode

目录

  • Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode

    • 1.聚合查询
    • 2.分组
    • 3.F查询和Q查询
    • 4.执行原生sql(了解)
    • 5.展示sql的
    • 6.设置 sql_mode

Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode

1.聚合查询

aggregate(*args, **kwargs)

aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

#示例
# 计算所有图书的平均价格
>>> from django.db.models import Avg
>>> Book.objects.all().aggregate(Avg('price'))
#结果:
    {'price__avg': 34.35}

>>> Book.objects.all().aggregate(a=Avg('price')) #或者给它起名字:aggretate(a=Avg('price'))
#结果:
    {'a': 34.35}
>>> Book.objects.aggregate(average_price=Avg('price'))
#结果:
    {'average_price': 34.35}  
如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
>>> from django.db.models import Avg, Max, Min
>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))  #count('id'),count(1)也可以统计个数,Book.objects.all().aggregete和Book.objects.aggregate(),都可以
#结果:
    {'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

2.分组

annotate

# models.Publish.objects.annotate(a=Avg('book__price')).values('a')

# models.Book.objects.values('publish_id','id').annotate(a=Avg('price')) {'pulish_id':1,'a':11.11}

#注意:annotate里面必须写个聚合函数,不然没有意义,并且必须有个别名=,别名随便写,但是必须有,用哪个字段分组,values里面就写哪个字段,annotate其实就是对分组结果的统计,统计你需要什么。

分组后排序:
Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')

3.F查询和Q查询

from django.db.models import F,Q

F  针对自己单表中字段的比较和处理
models.Book.objects.filter(good__gt=F('comment'))
models.Book.objects.all().update(price=F('price')+100)

Q    与&  或|  非~
filter(Q(xx=11)|Q(ss=22)&Q(oo=33))
filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33))  #&优先级高,先执行后面的&运算,再执行前面的|运算
filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33),name='dd')  #逗号(,)隔开的话,优先级是先执行完前面的或(|),再执行逗号(,)后面的and关系

4.执行原生sql(了解)

方式一:只能对本表进行原生sql操作
1.models.Publish.objects.raw('原生sql')
#<RawQuerySet: select * from app01_publish;>

代码示例:
def test(request):
ret = models.Publish.objects.raw('select * from app01_publish;')
for i in ret:
    print(i)
return HttpResponse('Test is completed')

方式二:对所有的表都可以进行原生sql操作
2.from django.db import connection
  cursor = connection.cursor()
  cursor.execute(sql,[1,])
  cursor.fetchall()

代码示例:
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from app01_publish;')
print(cursor.fetchall())
return HttpResponse('Test is completed')

5.展示sql的

显示orm语句转换成的原生sql语句
models.Book.objects.filter(good__gt=F('comment')*2)
from django.db import connection
print(connection.queries)

6.设置 sql_mode

1.查看当前会话的sql_mode:
    select @@sql_mode
2.设置当前会话的sql_mode:
    set @@sql_mode = 'only_full_group_by';
3.设置全局会话的sql_mode:
    set global sql_mode = 'only_full_group_by';
4.在配置文件中修改  

原文地址:https://www.cnblogs.com/liubing8/p/11644787.html

时间: 2024-08-06 05:23:17

Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode的相关文章

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

【Django】执行原生SQL的三种方法 &#632542;

原文: http://blog.gqylpy.com/gqy/383 "> 如下三种方式 extra:结果集修改器,一种提供额外查询参数的机制 raw:执行原始SQL返回模型实例 connection/connections:直接执行自定义SQL(此方法不依赖model) 1.extra示例: # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, tables=None, ord

68 聚合和分组, F和Q查询, cookie, session

主要内容: 1  聚合和分组: a : 先导入聚合函数: from django.db.models import  Max, Min, Avg, Count, Sum b : 可以为聚合函数设置名字:  max = Max('price') c : 聚合用到了aggregate,  是queryset的一个终止语句,  获取的结果是一个字典的形式. 1 from django.db.models import Avg, Sum, Max, Min, Count 2 ret = models.B

11.Django数据库操作(执行原生SQL)

1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 用在where后: Book.objects.filter(publisher_id="1").extra(where=["title='python学习1'"]) 用在select后 Book.objects.filter(publisher_id="1").extra(select={"count":"select

Django框架进阶5 models常用字段及参数, choices参数, 自动显示sql命令配置, orm查询优化相关, orm中的事务操作, MTV与MVC模型, 图书管理系统(图书的增删改查)

models中的常用字段 AutoField(primary_key=True) 主键   (int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列.) CharField(max_length=32)     varchar(32) IntegerField()       int BigIntergerField()           bigint DecimalField()    decimal EmailField(

asp.net EF框架执行原生SQL语句

1.执行无参数sql: string sql = "select * from IntegralInfo where convert(nvarchar,getdate(),23)='{0}' and status=1 and userinfoid='{1}'"; sql = string.Format(sql, DateTime.Now.ToString("yyyy-MM-dd"), uid); var IntegralInfoObj = db.Database.S

Django学习【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany(&qu

Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)

阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=10, decimal_places=2) # 库存数 inventory = models.IntegerField() # 卖出数 sale = models.IntegerField() def __s