ORM模型基础
Django ORM支持的数据库
- MySQL
- MariaDB
- SQLite
- Postgre SQL
- DRACL∈
Django ORM配置
项目配置(settings.py)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabase_user',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
- default一默认的数据库,可配置多个数据,使用名称来区分
- ENGINE一数据库引擎
- django.db.backends.postgresql
- django.db.backends.mysql
- django.db.backends.sqlite3
- django.db.backends.oracle
- NAME—数据库名称
- USER—数据库登录用户名
- PASSWORD-数据库登录密码
- HOST一数据库访问地址
- PORT一数据库访问端口
sqlite3的配置选项
只需要指定数据库引擎和数据库文件名称即可
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
mysql数据库新建
- 字符集:utf8mb4
- 排序规则:utf8mb4_general_ci
安装依赖(数据库)
pip install mysqlclient
常见的ORM字段类型
字段 | 描述 |
---|---|
char | 固定长度字符 |
varchar | 可变长度字符串 |
text | 长文本 |
float / decimal | 浮点数(小数) |
int / tinyint | 整型 |
data / time / datetime | 日期/时间 |
模型代码示例
from django.db import models
class User(models.Model):
"""用户模型"""
name = models.CharField('姓名',max_length=64)
age = models.PositiveIntegerField('年龄',default=0)
文本
- CharField、TextField ———— 字符串(varchar)、文本(text)
- FileField、ImageField ———— 文件、图片
- FilePathField ———— 文件路径
- EmailField ———— 邮件地址
- URLField ———— URL地址
数字(整数)
- IntegerField ———— 整数
- SmalllntegerField ———— 整数
- BiglntegerField ———— 整数
- BooleanField ———— 布尔值(1,0)
- PositivelntegerField ———— 正整数
数字(小数)
- FloatField、DecimalField ———— 小数
日期与时间
- DateField ———— 日期(2050年5月1日)
- TimeField ———— 时间(早上8:00)
- DateTimeField ———— 日期时间(2050年5月1日 早上8:00)
特殊类型
- OneToOneField ———— 对一关联
- ForeignKey ———— 外键关联
- ManyToManyField ———— 多对多关联
- GenericForeignKey ———— 复合关联
模型基类django.db.models.Field
类型之间的关系
类型的选项(可选参数)
- 每个类型都有可选参数,部分类型有必传参数
- 参数传递是无序的(需要写参数的名称)
- 般情况下,第一个参数不指定名称
- verbose name
- 大多数模型类型的第一个参数
- ForeignKey、ManyToManyField、OneToOneField
- null、blank ———— 是否为Nul、空值
- db column ———— 数据库表中对应的字段名称
- default ———— 不填写改字段值时的默认值
- primary_key、unique ———— 主键、唯一索引
- help_text ———— 帮助文字
- choices ———— 可供选择的选项,如:性别的选项(男,女)
from django.db import models
sex = models.CharField('性别',max_lenth=1,choices={
('1','男'),
('2','女'),
})
- get_FOO_display() ———— 展示choices对应的值
CharField
- max_length ———— 最大长度
- 相关类型
- EmailField ———— 邮件输入
- URLField ———— URL输入
- 相关类型
DateTimeField
- auto_now ———— 更新时间为记录更改时的时间
- auto_now_add ———— 记录创建的时间
模型的创建
from django.db import models
# Create your models here.
class User(models.Model):
"""用户模型"""
name = models.CharField('姓名', max_length=64)
sex = models.CharField('性别', max_length=1, choices=(
('1', '帅哥'),
('0', '美女'),
), default='1')
age = models.PositiveIntegerField('年龄', default=0)
# unique=True 用户名唯一
username = models.CharField('用户名', max_length=64, unique=True)
password = models.CharField('密码', max_length=256)
# null=True 可以空,blank=True 可以是空字符串
remark = models.CharField('备注', max_length=64, null=True, blank=True)
# 用户创建时间
created_at = models.DateTimeField('注册时间', auto_now_add=True)
# 用户修改时间
updated_at = models.DateTimeField('最后修改时间', auto_now=True)
模型同步migrate
- 前提:确认settings.py
- 已将模型添加到INSTALLED_APPS
实现模型同步
- 步骤一:检查模型是否编写正确
python manage.py check
- 步骤二:使用
makemigrations
生成同步原语
python manage.py makemigrations
- 步骤三:使用migrate执行同步
python manage.py migrate
模型的元数据
元数据的描述
- 使用Meta类来表示
- 对模型的补充说明
# 示例
class Meta:
verbose_name = '用户基础信息'
verbose_name_plural = '用户基础信息'
# 指定模型表的名称
db_table = 'oauth_user'
元数据的描述
- db_table ———— 模型映射的数据库表的名称
- ordering ———— 指定数据表的默认排序规则
- verbose_name ———— 供编程查看的字段名称(便于阅读)
- abstract ———— 抽象类
- 抽象类不会生成数据库表
- proxy ———— 代理模型(对父模型的功能进行扩充)
外键关联类型
一对一关系
- OneToOneField(to, on_delete, parent_link=False, **options)
- 举例:用户信息进行分表(用户基础信息和用户详细信息)
一对多关系
- ForeignKey(to, on_delete, **options)
- 举例:用户提问(一个用户可以提很多问题)
多对多关系
- ManyToManyField(to, **options)
- 举例:收藏问题()
类型的参数选项
- to ———— 关联的模型(必传)
- 模型类
- 模型类(字符串)
- self(关联同一个类:自己)
- on_delete ———— 删除选项(必传)
- CASCADE:关联删除
- PROTECT:受保护,不允许被删除
- SET_NULL:设置为None,需要添加选项null=True
- SET_DEFAULT:设置为默认值,需要添加选项default
- SET():传参设置值
- DO_NOTHING:什么也不做
- related_name ———— 是否需要反向引用,反向引用的名称
- related_query_name ———— 反向引用的名称