Django第七课之常用查询及表关系的实现

88 阅读2分钟

我们在上节课中呢学到了如何创建表和表的基本增删改查,这节课我们学习常用的查询和表的基本关系。

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. 常用模型字段类型

<docs.djangoproject.com/en/2.1/ref/…>





## 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)