Django第七课之常用查询及表关系的实现
我们在上节课中呢学到了如何创建表和表的基本增删改查,这节课我们学习常用的查询和表的基本关系。
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. 常用模型字段类型
<https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types>
## 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)