企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 查询 本节内容 1. 条件查询 2. F对象 3. Q对象 4. 聚合 5. 排序 6. 关联查询 [准备测试数据](TestDatas.html) ### 一、条件查询 1. 调用`filter方法`:**模型类.objects.filter(模型类属性名\_\_条件名=值)** 2. 返回包含查询结果数据的`QuerySet`对象 **练习案例:** 1. 判等: exact ~~~ 例:查询id为1的员工 ~~~ 2. 模糊查询: contains / endswith / startswith ~~~ 例:查询名字包含'马'的员工 例:查询名字以'军'结尾的员工 ~~~ 3. 空查询: isnull ~~~ 例:查询备注信息不为空的员工 ~~~ 4. 范围查询: in ~~~ 例:查询id编号为1或3或5的员工 ~~~ 5. 比较查询: gt(greater than)、lt(less than)、gte、lte ~~~ 例:查询age大于30的员工 ~~~ 6. 日期查询: year、month、day、week\_day、hour、minute、second ~~~ 例:查询2015年入职的员工 例:查询2014年1月1日后入职的员工 ~~~ [案例参考答案](ORM查询.html) ### 二、F对象 之前的查询都是对象属性与常量值比较,如果要比较两个属性怎么做呢? 比如:`查询语文分数大于数学分数的学生` | 姓名 | 数学 | 语文 | 英语 | | --- | --- | --- | --- | | Tom | 95 | 90 | 95 | | Jack | 95 | 90 | 95 | | Rose | 90 | 92 | 98 | 1. F对象:**比较表中的两个字段**,接收的参数为一个字符串 2. 用法:`F('属性名')` * 比如:`成绩表.objects.filter(语文__gt=F('数学'))` * 需要导包:`from django.db.models import F` 3. 案例 ~~~ 例:查询年龄大于id的员工信息(无实际意义) 例:查询年龄大于4倍id编号的员工信息(无实际意义) ~~~ [案例参考答案](ORM查询.html) ### 三、Q对象 * 作用:**对查询条件进行`与 或 非`(& | ~) 的逻辑操作** * 用法: 先导入`from django.db.models import Q` * 与: Q(查询条件1) & Q(查询条件2) * 或: Q(查询条件1) | Q(查询条件2) * 非: ~Q(查询条件) * 案例 ~~~ 例:查询id大于3且年龄大于30的员工信息。 例:查询id大于3或者年龄大于30的员工信息。 例:查询id不等于3员工信息。 ~~~ [案例参考答案](ORM查询.html) ### 四、排序 * 作用: 对查询结果进行排序,**默认为升序** * 用法: 升序:**模型类.objects.order\_by('属性名')** 降序:**模型类.objects.order\_by('-属性名')** * 示例: ~~~ 例:查询所有员工信息,按照id从大到小进行排序。 例:把id大于3的员工信息按年龄从大到小排序显示 ~~~ ### 五、`aggregate`方法 * 作用: 聚合操作,对多行查询结果中的一列进行操作,返回一个值 * 用法:**模型类.objects.aggregate(聚合类('属性名'))** * 常用聚合类有:Sum, Count, Max, Min, Avg等 * 返回值是一个字典, 格式:`{'属性名__聚合函数': 值}` * 使用时需要先导入聚合类:`from django.db.models import Sum, Count, Max, Min, Avg` * 案例: ~~~ 例:查询所有员工的平均工资。 ~~~ [案例参考答案](ORM查询.html) ### 六、关联查询 假设在`一对多`关系中,一对应的类叫做`一类`,多对应的类叫做`多类` 一、通过`对象`进行关联查询 1. 由`一类对象`查询`多类对象`:**`一类对象.多类名小写_set.all()`** 2. 由`多类对象`查询`一类对象`:**`多类对象.关联属性`** 3. 示例 ~~~ # 查询 “研发部” 的所有员工 d = Department.objects.get(name=‘研发部’) d.employee_set.all() # 一查多 # 例:查询 “赵小二” 所属的部门信息 e = Employee.objects.get(name='赵小二') e.department # 多查一 ~~~ 二、通过`模型类`实现上述两个案例 * `一类名.objects.filter(多类名小写__多类属性名__条件名=值)` * `多类名.objects.filter(关联属性__一类属性名__条件名=值)` 实现参考: ~~~ Employee.objects.filter(department__name__exact='研发部') Department.objects.filter(employee__name__exact='赵小二') # 简写 Employee.objects.filter(department__name='研发部') Department.objects.filter(employee__name='赵小二') ~~~