Django 非常适合构建数据库驱动型网站,它提供了简单而强大的工具(ORM),易于使用 Python 执行数据库查询。模板和视图,模板负责显示,视图负责执行逻辑,然后返回响应。对现代的 Web 应用程序而言,视图逻辑经常需要与数据库交互。Object Relational Mapping,简称ORM(对象关系映射)将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式(对象)转换到另外一种形式(数据库表格)。
python中的一个类对应对应数据库中的一张表格。
python中的一个对象对应表格中的一条记录。
Python中的类的属性 对应 表格中的字段。
Python | 对应ORM |
---|---|
类 | 表格 |
对象 | 记录 |
属性 | 字段 |
django.db.models包,字段类型
类型 | 描述 |
---|---|
AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性(主键) |
BooleanField | 布尔字段,值为True或False。 |
NullBooleanField | 支持Null、True、False三种值。 |
CharField(max_length=最大长度) | 字符串。参数max_length表示最大字符个数。 |
TextField | 大文本字段,一般超过4000个字符时使用。 |
IntegerField | 整数 |
DecimalField(max_digits=None, decimal_places=None) | 十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。 |
FloatField | 浮点数 |
DateField:([auto_now=False, auto_now_add=False]) | 日期。 1)参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。 2) 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。 3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误. |
TimeField | 时间,参数同DateField。 |
DateTimeField | 日期时间,参数同DateField。 |
FileField | 上传文件字段。 |
ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片。 |
注意: | ImageField()字段需要借助pillow模块才能使用,因此需要先下载pillow模块。Python3.6后 使用PIL模块。 |
通过选项实现对字段的约束,选项如下:
选项名 | 描述 |
---|---|
default | 默认值。设置默认值。 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。 |
unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False。 |
db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False。 |
db_column | 字段的名称,如果未指定,则使用属性的名称。 |
null | 如果为True,表示允许为空,默认值是False。 |
常用方法
方法 | 用法 |
---|---|
first() | 返回第一条记录,返回具体的某个模型类的对象 |
last() | 返回最后一条记录,返回具体的某个模型类的对象 |
get(**kwargs) | 返回具体的某个模型类的对象 返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会 抛出错误。 |
filter() | 返回 QuerySet 列表对象,可多个 |
all() | 返回 QuerySet 列表对象,查询所有结果 |
exclude() | 返回 QuerySet 列表对象,它包含了与所给筛选条件不匹配的对象 |
order_by() | 返回 QuerySet 列表对象, (1)根据多个字段进行排序 (2)反向排序可以在字段名称前面加上“-”(减号) (3)在模型中指定默认排序 |
reverse() | 返回 QuerySet 列表对象,对查询结果反向排序, 通常只能在具有已定义顺序的QuerySet上调用(在model 类的Meta中指定ordering或调用order_by()方法)。 |
values() | 返回一个ValueQuerySet(一个特殊的QuerySet),运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 |
values_list() | 它与values()非常相似,它返回的是一个元组序列 |
exists() | 如果QuerySet包含数据,就返回True,否则返回False |
count() | 返回数据库中匹配查询(QuerySet)的对象数量 |
双下划线方法
方法 | 名称 | 例子 |
---|---|---|
xx__lt | 小于 | id__lt =2,获取 id小于2的所有记录 |
xx__gt | 大于 | id__gte=30 获取id大于等于30的所有记录 |
xx__in | 包含某些值 | id__in=[10,5] 获取id为10,5的所有记录 |
xx__range() | 查找范围 | id__range=[10,20]返回id在10至20之间的记录 |
xx__contains() | 包含某个字符的记录 | name__contains='t’获取name包含’t’的记录 |
xx__startswith | 获取 以 xx开头的记录 | name__startswith='t’获取name以‘t’开头的记录 |
xx__endswith | 获取以xx结尾的记录 | name__iendswith ='t’获取name以’t’结尾的记录,加’i’忽略大小写 |
xx__date | date类型字段可以根据年月日进行过滤 | birthday__year = '2019’获取birthday中year是2019的记录 |