django ORM(二)

1.常用的模型字段类型
https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types

1. IntegerField : 整型,映射到数据库中的int类型。

2. CharField: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。

3. TextField: 文本类型,映射到数据库中的text类型。

4. BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。

5. DateField: 日期类型,没有时间。映射到数据库中是date类型, 在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间。

6. DateTimeField: 日期时间类型。映射到数据库中的是datetime类型, 在使用的时候,传递datetime.datetime()进去。

2.字段的常用参数
官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-options

  1. primary_key: 指定是否为主键。
  2. unique: 指定是否唯一。
  3. null: 指定是否为空,默认为False。
  4. blank: 等于True时form表单验证时可以为空,默认为False。
  5. default: 设置默认值。
  6. DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。
  7. DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值

3.常用查询
通过模型类上的管理器来构造QuerySet。
- 模型类上的管理器是啥?
模型类.objects
- QuerySet 表示数据库中对象的集合。
等同于select 语句。 惰性的
案例:

 

 

- first() 获取第一条 返回的是对象
- last() 获取最后一条 返回的也是一个对象
思考:排序规则? 默认通过主键。通过_meta 设置
- get(**kwargs) 根据给定的条件,获取一个对象,如果有多个对象符合,保存

- all() 获取所有记录 返回的是queryset
- filter(**kwargs) 根据给定的条件,获取一个过滤后的queryset,多个条件使用and连接。
- exclude(**kwargs) 跟filter使用方法一致,作用想反,它是排除。

Student.objects.exclude(id=13)
SELECT * FROM `student_student` WHERE NOT (`student_student`.`id` = 13)

 

- 多条件的OR连接 用到Q对象,

django.db.models.Q
from django.db.models import Q 
Student.objects.filter(Q(name='战三',sex=0))
SELECT * FROM `student_student` WHERE (`student_student`.`name` = 战三 AND `student_student`.`sex` = 0)

- values(*fields) 返回一个queryset,返回一个字典列表,而不是数据对象。
- only(*fiels) 返回querySet ,对象列表,注意only一定包含主键字段
- defer(*fields) 返回一个QuerySet,作用和only相反
- order_by(*fields) 根据给定的字段来排序 默认是顺序,字段名前加上 ‘-’代表反序
- 切片 和python的列表切片用法相似,不支持负索引,数据量大时不用步长
*** 切片过后,不再支持,附加过滤条件与排序
- 常用查询条件 filter,exclude, get
- exact 精确匹配
Student.objects.filter(name__exact='张三')
- iexact 模糊匹配,不区分大小写
Student.objects.filter(name__iexact='zhangsan')
- contains 包含 区分大小写
Student.objects.filter(name__contains='zhang')
- icontains 包含 不区分大小写
Student.objects.filter(name__icontains='zhang')
- in 存在内,列表元素
- range 在区域之间,元组起始
- gt 大于
- gte 大于等于
- lt 小于
- lte 小于等于
- startswith 什么字符开始的,区分大小写
- istartswith 什么字符开始的,不区分大小写
- endswith 什么字符结束的,区分大小写
- iendswith 什么字符结束的,不区分大小写
- isnull True False 对应 IS NULL IS NOT NULL
- 聚合

from django.db.models import Count, Avg, Max, Min, Sum

通过queryset的aggregate方法

Student.objects.aggregate(age_avg=Avg('age')) # 计算平均年龄

- count
- 平均值 Avg
- 分组,聚合
结合 Values,annotate 和聚合方法一起实现
annotate 分组

Student.objects.values('sex').annotate(num=Count('sex')) 

<QuerySet [{'sex': 1, 'num': 6}, {'sex': 0, 'num': 2}]>

SELECT `student_student`.`sex`, COUNT(`student_student`.`sex`) AS `num` FROM `student_student` GROUP BY `student_student`.`sex` ORDER BY NULL

意识是查询男生有几个,女生有几个

 

 

posted on 2019-03-12 15:44  人之初-柳  阅读(182)  评论(0编辑  收藏  举报