Model 模型
一、配置数据库
settings.py文件中 默认为sqlite数据库 更改成mysql数据库
实例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'helloworld',
'HOST':'127.0.0.1',
'PORT':3306,
'PASSWORD':'123456',
'USER':'root',
}
}
project的init.py文件中宏 添加代码如下
import pymysql
pymysql.install_as_MySQLdb()
二、ORM
随着项目越来越大 采用原生SQl的方式 在代码中就会出现大量的SQL语句 那么就会出现如下问题:
- SQL语句重复利用率不高 越复杂的SQL语句条件就会越多 代码越长 会出现很多相近的SQL语句
- 很多SQL语句都是在业务逻辑中拼接出来的 如果有数据库需要更改 就要去修改这些逻辑 这会很容易漏掉对某些SQL语句的修改
- 写原生SQL语句时 胡忽略WEB安全问题 给未来造成隐患
什么是ORM?
orm中文叫做关系映射 通过ORM我们可以通过类的方式去操作数据库 而不用再去写原生的SQL语句 通过把表映射成类 把行作为实例 把字段作为属性 ORM在执行对象操作数据库的时候 最终还是会转换为操作数据库的原生SQL语句
使用ORM优点:
- 易用性 使用ORM做数据库的开发 可以有效的减少重复sQL语句的概率 写出来的模型也更加的直观 清晰
- 性能损耗小 ORM转换成底层数据库操作指令 确实会有一些开销 但从时机情况来看 这种性能损耗很小 只要不是对性能有严苛的要求 综合考虑开发效率 代码的阅读性 带来的好处要远远大于性能损耗 而且项目越大 作用就越明显
- 设计灵活 可以轻松的写出复杂的SQL语句
- 可移植性 封装了底层数据库的实现 支持多个关系数据库引擎 包括流行的sqlite MySQL等数据库 轻松切换数据库 来去自如
三、模型的字段和可选条件
(1) 字段类型
字段名称 | 字段说明 | 参数 |
---|---|---|
AutoField | 一个根据实际ID自动增长的IntegerField 通常不指定(自动生成) | |
CharField | varchar类型字段 | max_length 存储值的最大长度 |
TextField | longtext类型长文本 | |
IntegerField | int类型字段 存储整形 | |
DecimalField | 存储浮点型 更加精准(存储) | max_digits=None 位数长度 decimal_places=None 小数的位数 |
FloatField | 存储浮点类型 | |
BooleanField | 存储Bool值 True/False | |
NullBooleanField | 存储null/True/False | |
DateField | date子段 | auto_now=False 如果对数据进行修改 则会自动保存修改的时间 auto_now_add=False 会自动保存第一次保存数据的时间 俩个参数不能同时使用 |
TimeField | time字段 | 参数同上 |
DateTimeField | datetime字段 | 参数同上 |
(2) 字段选项
可选参数 | 参数说明 |
---|---|
null | 如果设置为True 则当前字段值可以为null |
blank | 如果设置为True 则当前字段可以为空(什么值都没有) |
db_column | 设置字段名称 不设置 字段默认名称为属性名 |
db_index | 常规索引 |
unique | 唯一索引 |
primary_key | 主键索引 |
default | 默认值 |
四、定义模型
(1) 模型 数学 表之间的关联
一个模型类 对应数据库中的一张表 一个类数学对应表中的一个字段
(2) 创建我们测试的模型类
models.py
from django.db import models
# Create your models here.
class Test(models.Model):
char = models.CharField(max_length=20,default='默认值',db_index=True)
text = models.TextField(null=True,blank=True)
inter = models.IntegerField(db_column='inte')
deci = models.DecimalField(max_digits=5,decimal_places=2)
float = models.FloatField()
bool = models.BooleanField()
null = models.NullBooleanField()
date = models.DateField(auto_now=True)
time = models.TimeField(auto_now=True)
datetime = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.char
注意:
blank=True 只能用在字符串的字段类型上 不能用在数值上
(3) 执行迁移 到我们的数据库中
python3 manage.py makemigrations
python3 manage.py migrate
注意:
- 如果在执行创建迁移文件的时候 提示没有模型改变 那么就将新建的模型在别的视图函数文件中执行导入 那么出现这个问题的原因(当前django没有检测到你所写的模型类)
- 默认的模型名称为 应用名_类名 App_test
数据库中表结构
mysql> desc test;
+----------+--------------+------+-----+