目录
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="物语")