我们在上节课中呢学到了如何创建表和表的基本增删改查,这节课我们学习常用的查询和表的基本关系。
all():获取所有
first():获取第一条
last():获取最后一条
get(**kwargs):根据条件获取一条数据,没有或者获取到多个就会报错。
filter(**kwargs):根据条件获取数据
exclude(**kwaegs):排除条件以外的数据,作用跟filter一样
order_by(*fields):根据字段排序,默认是asc,在字段前加一个负号就是desc
切片使用列表的切片语法操作query,除了不能用负索引,其他的都可以,它等价于LIMIT与OFFSET子句
values(*fields)返回queryset, 这个queryset返回的是一个字典列表。参数fields指定了select中我们想要限制查询的字段。返回的`字典`列表中,只会包含我们指定的字段。如果不指定,包含所有字段。
only(*fields)返回一个queryset,跟values一样,区别在于这个queryset是对象列表,only一定包含主键。 - defer(*fields) 用法与only相反 - 多条件OR连接,需要实现OR条件,我们要使用Q对象。 ``` from django.db.models import Q res = Student.objects.filter(Q(age=18)|Q(age=19)).only('name') # 等价于下面的sql SELECT `teacher_student`.`id`, `teacher_student`.`name` FROM `teacher_student` WHERE (`teacher_student`.`age` = 18 OR `teacher_student`.`age` = 19) ``` - 查询条件 - exact 精确匹配 field like ‘value’ - iexact 忽略大小写 - contains field liek ‘%value%’ - icontains - in 后面的值是一个列表 - gt grate than - gte grate than equ - lt less than - lte - startswith 以什么什么开始 field like ‘value%’ - istartswith - endswith 以什么结束 field like ‘%value’ - iendswith - range 范围区间 between to - isnull is NULL 语法都是`field__conditon` 是 两个下划线
- count() 返回queryset的长度 统计长度(from django.db.models import Count) - 聚合函数 - Avg 平均值(from django.db.models import Avg) ``` # 计算同学们的年龄平均值 res = Student.objects.aggregate(age_avg=Avg('age')) ``` - Max 最大值 ``` # 找到最大的年龄 res = Student.objects.aggregate(age_max=Max('age')) ``` - Min 最小值 - Sum求和 - 分组,聚合,分组需要结合values,annotate和聚合方法看下面的案例 ``` # 查询男生女生分别有多少人 In [84]: from django.db.models import Count In [85]: res = Student.objects.values('sex').annotate(Count('sex')) ``` ## 2. 常用模型字段类型 ## 3. 表关系实现 django 中,模型通过特殊的字段进行关系连接 - 一对一 关联方式:在副表类中添加:models.OneToOneField('主表类',on_delete=models.CASADE) - 一对多 关联方式:在一表类中添加:models.ForeignKey('多表类',on_deleter=models.SET_NULL) - 多对多 关联方式:因为多对多会出现第三张表,所以的手动创建中间表, 在多表类中添加:models.ManyToManyField('多表类',through='中间表类名称') 在中间表中添加:models.ForeignKey('多表类',on_deleter=models.CASADE) models.ForeignKey('多表类',on_deleter=models.CASADE)