1.常用的模型字段类型 https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types
2.字段的常用参数 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-options
3.常用查询 通过模型类上的管理器来构造QuerySet。
模型类上的管理器是啥? 模型类.objects,<django.db.models.manager.Manager>实例
-
QuerySet 表示数据库中对象的集合。 等同于select 语句。 惰性的,不会立刻操作数据库,在计算,循环,切片,索引时会执行select语句. 案例:
first() 获取第一条 返回的是对象
last() 获取最后一条 返回的也是一个对象 思考:排序规则? 默认通过主键。通过_meta 设置
get(**kwargs) 根据给定的条件,获取一个对象,如果有多个对象符合,报错.
all() 获取所有记录 返回的是queryset
filter(**kwargs) 根据给定的条件,获取一个过滤后的queryset,多个条件使用and连接。
exclude(**kwargs) 跟filter使用方法一致,作用想反,它是排除。
多条件的OR连接 用到Q对象,django.db.models.Q 例子: Students.objects.filter(Q(age=18)|Q(age=19))
values(*fields) 返回一个queryset,返回一个字典列表,而不是数据对象。 例子:Students.objects.values('name','age')
only(*fields) 返回querySet ,对象列表,注意only一定包含主键字段,在实际开发过程中比较常用,可以灵活取值.
defer(*fields) 指定想要排除的字段.返回一个QuerySet,作用和only相反.
order_by(*fields) 根据给定的字段来排序 默认是顺序,字段名前加上 ‘-’代表反序
切片 和python的列表切片用法相似,支持步长,不支持负索引,数据量大时尽量不用步长,速度慢. 切片过后,不再支持,附加过滤条件与排序,因为已经执行返回列表. 例子:Students.objects.all()[:5:2]
常用查询条件 filter,exclude, get,
-
加两个下划线使用,如name__contains.
exact 准确匹配
iexact 不区分大小写,query中是LIKE
contains 包含,query中的BINARY是区分大小写.
icontains 不区分大小写包含.
in 参数为列表,元组或query_set
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')) # 计算平均年龄,age_avg生成一个key.
count
平均值 Avg
分组,聚合 结合 Values,annotate 和聚合方法一起实现 查询男生有几个,女生有几个
from django.db.model. import Count
Student.objects.values('sex').annotate(num=Count('sex'))
4.表关系实现
常用的查询方法:
常用的查询条件:
查找对象的条件的意思是传给以上方法的一些参数。相当于是SQL语句中的where语句后面的条件,语法为字段名__规则(是连着连个下划线哦)
常用的字段类型映射关系:
常用的字段类型:
IntegerField : 整型,映射到数据库中的int类型。
CharField: 字符类型,映射到数据库中的varchar类型,通过max_length指定最大长度。
TextField: 文本类型,映射到数据库中的text类型。
BooleanField: 布尔类型,映射到数据库中的tinyint类型,在使用的时候,传递True/False进去。如果要可以为空,则用NullBooleanField。
-
DateField: 日期类型,没有时间。映射到数据库中是date类型,
在使用的时候,可以设置DateField.auto_now每次保存对象时,自动设置该字段为当前时间。设置DateField.auto_now_add当对象第一次被创建时自动设置当前时间。
-
DateTimeField: 日期时间类型。映射到数据库中的是datetime类型,
在使用的时候,传递datetime.datetime()进去。
Field的常用参数:
primary_key: 指定是否为主键。
unique: 指定是否唯一。
null: 指定是否为空,默认为False。
blank: 等于True时form表单验证时可以为空,默认为False。
default: 设置默认值。
DateField.auto_now: 每次修改都会将当前时间更新进去,只有调用,QuerySet.update方法将不会调用。这个参数只是Date和DateTime以及TimModel.save()方法才会调用e类才有的。
DateField.auto_now_add: 第一次添加进去,都会将当前时间设置进去。以后修改,不会修改这个值
1.创建模型类
2.执行生成映射文件的命令后,查看数据表
3.插入数据.
4.查看插入的数据.
表关系的实现:
表关系的例子:
创建模型类:
外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错!
一般使用CASCADE表示级联删除
查看数据库中创建的表:
写好模型类后,执行生成映射文件的命令.
执行完makemigrations和migrate的命令后,在数据库我们能看到5张表,其中多对多关系的ManyToManyField
方法自动生成了关系表.