Django对数据库的聚合、分组、F和Q查询

目录

 

1、聚合查询

2、分组查询

3、F查询

4、Q查询


1、聚合查询

导入包:

from django.db.models import Avg, Sum, Max, Min, Count

使用方法: 

# 求所有书的平均价格

models.Book.objects.all().aggregate(avg_price=Avg("price"))  --> 字典{“avg_price”: xx}

# 求所有书的价钱和

models.Book.objects.all().aggregate(avg_price=Sum("price"))

#找所有书中价钱最贵的

models.Book.objects.all().aggregate(avg_price=Max("price"))

#计算一共多少书

models.Book.objects.all().count()

 

2、分组查询

使用sql语句如下:

# 求部门的平均薪资

SELECT AVG("salary") FROM employee GROUP BY dept;

# 连表查询

SELECT dept2.name, AVG(salary) FROM employee2 INNER JOIN dept2 ON employee2.dept_id = dept2.id GROUP BY dept_id;

使用ORM:

# 求部门的平均薪资
 
models.Employee.objects.values("dept").annotate(salary_avg=Avg("salary")).values("dept", "salary_avg")

# 连表查询

models.Employee2.objects.values("dept__name").annotate(salary_avg=Avg("salary")).values("dept__name","salary_avg")

 

3、F查询

先导包

from django.db.models import F

1. 两个字段之间作比较

models.Product.objects.filter(maichu__gt=F("kucun"))

2. 字符串拼接    

from django.db.models.functions import Concat

from django.db.models import Value

models.Product.objects.update(name=Concat(F("name"), Value("新款")))

 

3. update修改字段和对象.属性修改字段的区别:

  • 对象.属性方法会更新所有字段
  • update方法只会更新你修改的那个字段

实例:

from django.db.models import F

#查询评论数大于收藏数的书籍

models.Book.objects.filter(commnet_num__gt=F('keep_num'))

#Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。

models.Book.objects.filter(commnet_num__lt=F('keep_num')*2)

#修改操作也可以使用F函数,比如将每一本书的价格提高30元

models.Book.objects.all().update(price=F("price")+30)

 

4、Q查询

导包:

from django.db.models import Q

1. 多个查询条件做 交集 并集 取反操作时

2. 如果Q查询和关键字查询同时存在时,Q查询要放在关键字查询的前面!!!

示例1:

查询作者名是小仙女或小魔女的

models.Book.objects.filter(Q(authors__name="小仙女")|Q(authors__name="小魔女"))

你可以组合& 和 |  操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用 ~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。

示例:查询作者名字是小仙女并且不是2018年出版的书的书名。

models.Book.objects.filter(Q(author__name="小仙女") & ~Q(publish_date__year=2018)).values_list("title")

查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。

例如:查询出版年份是2017或2018,书名中带物语的所有书。

models.Book.objects.filter(Q(publish_date__year=2018) | Q(publish_date__year=2017), title__icontains="物语")

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值