Django Web开发之ORM

Django中的ORM

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

参考文档:https://docs.djangoproject.com/zh-hans/2.2/topics/db/models/

Django数据库配置

# settings文件下
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql", # 这里可以根据实际情况修改,譬如换成oracle、PostgreSQL等
        "NAME": "数据库名称",  
        "USER": "用户名",
        "PASSWORD": "密码",
        "HOST": "数据库访问地址",
        "POST": 3306 # Mysql数据库默认使用3306
    }
}

建立model

model包含了存储的数据的重要字段和行为。
一个模型映射到一个数据库表。

model示例

from django.db import models

class Students(models.Model):
	  name = models.CharField(max_length=30) # CharField为字段类型,max_length 为字段参数选项
	  age = models.IntegerField()
	  gender = models.BooleanField()
	  cs = models.ForeignKey('ClassInfo', on_delete=models.DO_NOTHING)

class ClassInfo(modes.Modell):
	 title = models.CharField(max_length=30)

执行,生成数据表

python manage.py makemigrations
python manage.py migrate

常用字段

类型 描述
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,对上传的内容进行校验,确保是有效的图片。

字段选型

常用选项

选项名 描述
default 默认值。设置默认值。
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False。
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False。
db_column 字段的名称,如果未指定,则使用属性的名称。
null 如果为True,表示允许为空,默认值是False。
blank 如果为True,则该字段允许为空白,默认值是False。

关系表选项

ForeignKey 外键关联

一般把ForeignKey字段设置在 '一对多'中'多'的一方。
ForeignKey可以和其他表做关联关系,,也可以和自身做关联关系。

选项名 描述
to 设置要关联的表
to_field 设置要关联的表的字段
related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'
related_query_name 反向查询操作时,使用的连接前缀,用于替换表名
on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。
db_constraint 是否在数据库中创建外键约束,默认为True。
  • on_delete 可选项
选项名 描述
models.CASCADE 删除关联数据,与之关联也删除
models.DO_NOTHING 删除关联数据,引发错误IntegrityError
models.PROTECT:删除关联数据,引发错误ProtectedError
models.SET_NULL:删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT:删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET 删除关联数据,. 与之关联的值设置为指定值或者可执行对象的返回值,设置:models.SET(值)
ManyToManyField多对多

用于表示多对多的关联关系,在数据库中通过第三张表来建立关联关系。

选项名 描述
to 设置要关联的表
related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'
related_query_name 反向查询操作时,使用的连接前缀,用于替换表名
symmetrical 仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
through 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系,也支持手动创建第三张表,此时就需要通过through来指定第三张表的表名。
through_fields 设置关联的字段。
db_table 默认创建第三张表时,数据库中表的名称。

DatetimeField、DateField、TimeField特有参数

选项名 描述
auto_now_add 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now 配置上auto_now=True,每次更新数据记录的时候会更新该字段。
posted @ 2020-04-13 11:54  leafgood  阅读(207)  评论(0编辑  收藏  举报