django模型系统(二)
常用查询
- 每一个django模型类,都有一个默认的管理器,objects
QuerySet表示数据库中对象的列表。他可以有0到国歌过滤器。过滤器通过给定参数,缩小查询范围(filter)。
QuerySet等同与select语句,过滤器等同于一个限制字句,比如where、limit- 使用
.query
可查看对应的SQL语句
- all()获取所有
name.objects.all()queryset
- 获取第一条
name.objects.first()返回的是对象
- 获取最后一条
name.objects.last()返回的是对象
- get(**kwargs)根据给定的条件获取一个对象,如果符合多个或者没有就会报错
- filter(**kwargs)过滤,根据参数提供的条件,获取一个过滤器后的QuerySet,多个条件等同于
select子句
使用and连接,关键字参数的形参必须是模型中的字段名。
Student.objects.filter(name='xinlan').filter(age=18)
- exclude(**kwargs), 用法和filter一样,作用相反,它是排除
- order_by(*fields),根据给定的字段排序。多个的时候有先后顺序。
Student.objects.order_by('-age', 'name').query) # 默认asc,-age 代表反向排序
- 切片 使用列表的切片语法操作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
- 注意:要导入模块
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 精确匹配 例如:
Student.objects.filter(name__exact='XXX')#_exact可以不写
- iexact 忽略大小写
- contains 包含,对应sql的%
- icontains 包含(忽略大小写)
- in 等价sql的in
- gt 大于:grate than
- gte 大于等于:grate than equ
- lt 小于:less than
- lte 小于等于:less than equ
- startswith 以什么什么开始
- istartswith 忽略大小写
- endwith 以什么什么结束
- iendwith 忽略大小写
- range **__range=(),范围区间,等价于sql:between...and...
- isnull 是否为空
语法都是field__conditon=
是 两个下划线
count() ,统计。返回queryset的长度
聚合函数
语法:
list_name.objects.aggregate(anyname=Avg('age')) #必须要用aggregate方法,anyname自己命名#返回的市dit字典,不是query语句,无法查询sql语句
- 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'))
常用模型字段类型
官方文档说明:
表关系实现
django 中,模型通过特殊的字段进行关系连接
- 一对一
- 一对多
- 多对多
例如:
anyname = models.OneToOneField('class_name',on_delete=models.CASCADE)#on_delete级联等外键关系
注意事项:
多对多关系,如果第三方表还有额外得到属性,需要手动创建第三方表并加入额外属性。并且要使用
例如:through
属性指定第三张表。class A(models.Model): passclass B(models.Model): anyname = models.ManyToManyField('A',through='C')#B和A表多对多关联,手动生成第三方表,通过through指定第三方表C,在表C中可以添加额外属性class C(models,Model): pass