一,什么是ORM?
ORM也称是对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM是通过描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中,在业务逻辑层和数据库层之间充当了桥梁的作用。
二,ORM的优劣势:
1,优势:ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。ORM提供了对数据库的映射,不用直接编写SQL代码,只需要像操作对象一样从数据库操作数据。这样让开发人员专注于业务逻辑的处理,提高了开发效率。
2,劣势:因为不是直接写SQL语句,所有会在一定程度上牺牲程序的执行效率。时间久了就会把SQL语句忘记了,以后要使用SQL语句的时候就会(这是啥意思????)
切入正题
Django中的ORM
三,在Django项目使用MySQL数据库
1,在Django项目的setting.py文件中,配置数据库连接信息:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "你的数据库名称", # 需要自己手动创建数据库
"USER": "数据库用户名",
"PASSWORD": "数据库密码",
"HOST": "数据库IP",
"POST": 3306
}
}
2,在Django项目的__init__.py文件中写如下代码,告诉Django使用pymysql模块连接MySQL数据库:
import pymysql
pymysql . install_as_MySQLdb()
3,在Django项目的models.py文件中定义一个类(一个类相当于是数据库中的一个表)
每个类必须继承models.Model
而且每次定义完成或者修改类后,必须在命令行中执行下面两行代码,否则不会生效
1,python manage.py makemigrations ----->将models.py的修改记录保存下来
2,python manage.py migrate ------>将修改翻译成SQL语句,去数据库执行
4,在Django中model是你数据的单一,明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型映射到一个数据库表。
每一个模型都是一个python类,它是django.db.models.Model的子类。
模型的每个属性都代表一个数据库字段。
例:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
first_name 和 last_name 是模型的字段。每个字段被指定为一个类属性,每个属性映射到一个数据库列。
上面的 Person 模型将会像这样创建一个数据库表:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL );
一些说明:
- 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时。
- id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
- 本示例中的CREATE TABLE SQL使用PostgreSQL语法进行格式化,但值得注意的是,Django会根据配置文件中指定的数据库后端类型来生成相应的SQL语句
5,字段属性和方法:
-
- AutoField: 自动增长,通常不需要指定,django自动创建名为id的自动增长属性
- CharField: 字符串,必须指定的参数: max_length 最大字符个数
- TextFiled: 大文本字段,一般超过4000个字符
- IntegerField: 整形
- BooleanField: 布尔,支持Null,True
- NullBooleanField: 支持Null,True,False
- DateFiled: [auto_now=False, auto_now_add=False]
-
- auto_now 表示自动设置该字段为最后一次修改的时间,默认为False
- auto_now_add 表示自动设置该字段为创建时的时间,默认为False
- 两者互斥,不能同时使用
- DateTimeField: 日期时间
- DecimalFiled(max_digits=None, decimal_places=None):
-
- 十进制浮点数,适合用于保存金额,精度较高
- 必须指定参数,max_digits总位数,decimal_places小数位数
- FloatField: 浮点数,有误差
- FileField: 上传文件字段
- ImageField: 继承与FileFiled,对上传的内容进行校验,确保是有效地图片
- ForeignKey: 外键,建立一对多关系
6,字段选项:通过选项实现对字段的约束
选项 | 默认值 | 描述 | 是否要重新迁移修改表结构 |
---|---|---|---|
null | False | 如果为True,数据库中字段允许为空 | 是 |
unique | False | True表示这个字段在表中必须有唯一值 | 是 |
db_column | 属性名称 | 字段名,如果未指定,则使用属性的名称 | 是 |
primary_key | False | 若为True,则该字段会成为模型的主键字段,一般作为AutoField的选项使用 | 是 |
default | - | 默认值 | 否 |
blank | False | True,html页面后台填写表单验证时字段允许为空 | 否 |
editable | True | 如果设为False, 这个字段将不会出现在管理后台 | 否 |
choices | - | True,html页面表单验证时字段允许为空 | 否 |