#ORM
>ORM即Object Relational Mapping(对象关系映射)
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
在Django中具体的对应方式为:
* 类名对应数据库中的表名
* 类名对应数据库中的表名
* 类属性对应数据库里的字段
* 类实例对应数据库表里的一行数据
* 类实例对象的属性对应这行中的字段的值
#一.数据库的连接
Django默认使用的是sqlite,如果想使用mysql来存储数据,需要改变成相应的数据库引擎,具体如下:
######1.修改setting文件
将
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
```
改成
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'mysite',
'USER': 'root',
'PASSWORD': '000000',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
```
######2.引入pymysql驱动
在__init__.py文件中加上
```python
import pymysql pymysql.install_as_MySQLdb()
```
#二.表的创建
###1.一个简单的创建
数据库表的创建在ORM中就是类的创建。
```python
class student(models.Model):
name=models.CharField(max_length=20)
num=models.IntegerField()
school=models.ForeignKey(school,on_delete=models.CASCADE)
teacher=models.ManyToManyField(teacher)
def __str__(self):
return self.name
```
```python
class school(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class teacher(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
```
首先在models.py中简单的创建了三个表,然后需要在当前项目有manage.py文件目录下的cmd或者pycharm中的terminal下执行如下命令来同步数据库:
```python
python manage.py makemigrations #为模型改变生成迁移文件
python manage.py migrate #应用数据库迁移
```
这时在数据库中就会显示有这3张表了
###2.字段的类型与参数
几个常用的类型:
* CharField
* IntegerField
* TextField
* 等等
几个常用的参数:
* null
* default
* primary_key
* unique
* 等等
具体参考Django官方文档https://docs.djangoproject.com/en/2.1/ref/models/fields/
###3.表与表之间的关联
######1.外键
即一对多的关系
```python
school=models.ForeignKey(school,on_delete=models.CASCADE)
```
在建表时为school添加外键约束,在数据库中的显示为
这里的id是自动创建的,school_id是school添加外键产生的
如果想要与另一张表的其他字段添加外键,需要在加上参数to_filed='字段名',同时这个字段必须是unique=True
######2.一对一
一对一的创建即在外键创建好后给school_id添加UNIQUE=True的属性
######3.多对多
```python
teacher=models.ManyToManyField(teacher)
```
这样Django会默认添加一张表为
表示多对多的关系。
除了这种方式也可以手动创建一个表,手动添加两个外键来实现多对多。
#三.增删改查
增删改查的操作会在视图函数中进行,所以要先引入到views.py中
```python
from blog.models import *
```
###1.增加
######1.普通字段
create方式
```python
student.objects.create(name="student1",num=1,school=school_obj)
或者
student.objects.create(**{"name":"student1","num"="1","school"=obj"})
```
save方式
```python
student_obj=student(
name="student1",num=1,school=school_obj
)
student_obk.save()
或者
student_obj=student()
student_obj.name="student1"
student_obj.num=1
student_obj.school=school_obj
```
######2.一对多关系的字段
直接设置外键的id
在student.objects.create中加
```python
school_id=1
```
通过获取外键对象设置
```python
obj = school.objects.get(name="school1")
student.objects.create(**{"name":"student2","num":2,"school":obj})
```
######3.多对多关系的字段
```python
teacher1=teacher.objects.get(id=1)
teacher2=teacher.objects.get(id=2)
student1=s