(Object Relational Mapping,简称 ORM )
用于实现面向对象编程语言里不同类型系统的数据之间的转换使用 ORM 的好处:
使用 ORM 的缺点:
ORM 解析过程:
ORM 对应关系表:
pip install mysqlclient
修改 settings.py
中的DataBase配置项,并修改如下内容
"""
如果你使用了 Python2.x 版本这里添加了中文注释
你需要在 /settings.py 文件头部添加
# -*- coding: UTF-8 -*-
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'test_django', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'root', # 数据库密码
}
}
告诉 Django 使用 pymysql 模块连接 mysql 数据库
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
找到代码文件根目录
执行命令创建app
# linux环境下是 django-admin.py startapp app名称
django-admin startapp models
创建成功后目录结构如下
在 models/models.py
文件中创建ORM模型
from datetime import datetime
from django.db import models
# class Book 类名是数据库中的表名称
class Book(models.Model):
"""
自动创建一个列名为id的且为自增的整数列
字段名称 : name 代表数据库中表的字段 name
字段类型 : CharField = varchar DateTimeField=datetime FloatField=float
max_length 限制最大长度
null=False 不允许为空
"""
name = models.CharField(max_length=20, null=False)
author = models.CharField(max_length=20, null=False)
pub_time = models.DateTimeField(default=datetime.now)
price = models.FloatField(default=0)
字段类型 | django对应参数 | 参数描述 |
---|---|---|
主键自增 | AutoField | int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列 |
bigint自增列 | BigAutoField | 必须填入参数 primary_key=True |
整数 | IntegerField | 一个整数类型,范围在 -2147483648 ~ 2147483647 |
字符 | CharField | 字符类型,必须提供max_length参数, max_length表示字符长度 |
布尔值 | BooleanField | 布尔值类型,True,False |
浮点型 | FloatField | 浮点类型的小数 |
精准浮点类型 | DecimalField | 10进制小数,支持更多位数的浮点类型计算 |
日期 | DateField | 日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例 |
日期时间 | DateTimeField | 格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例 |
字符串类型 | EmailField | Django Admin以及ModelForm中提供验证机制 |
字符串类型 | IPAddressField | Django Admin以及ModelForm中提供验证 IPV4 机制 |
字符串类型 | URLField | Django Admin以及ModelForm中提供验证 URL |
字符串类型 | SlugField | Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) |
字符串类型 | UUIDField | Django Admin以及ModelForm中提供对UUID格式的验证 |
字符串类型 | CommaSeparatedIntegerField | 格式必须为逗号分割的数字 |
字段参数表
字段参数 | 描述 |
---|---|
null | null=False 代表该字段不允许为空 |
unique | 如果设置为unique=True 则该字段在此表中必须是唯一的 |
db_index | 如果db_index=True 则代表着为此字段设置数据库索引 |
default | 为该字段设置默认值,default = 字段默认值 |
auto_now_add | DatetimeField、DateField、TimeField这个三个时间字段,配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库 |
auto_now | DatetimeField、DateField、TimeField这个三个时间字段,配置上auto_now=True,每次更新数据记录的时候会更新该字段 |
ForeignKey | ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系, 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多’中’多’的一方 |
to | 设置要关联的表 |
to_field | 设置要关联的表的字段 |
related_name | 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’ |
在 myFirstDjango/settings.py
文件中找到 INSTALLED_APPS
配置,把app添加到配置中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'models'
]
在项目根目录下执行以下命令
当然执行命令也可以使用 pycharm的命令行
创建表结构
python --version // 查看python指向的版本
python manage.py migrate // 创建表结构
执行结果
让 Django 知道我们在我们的模型有一些变更,生成迁移脚本文件
python manage.py makemigrations app名称
python manage.py migrate app名称
查看数据库中是否有结果,表的命名方式为 app名称 _ class类名称
,所以我这里为models_book
1. pip install mysqlclient # 下载mysqlclient
2. 在settings.py中,配置好DATABASES,做好数据库相关的配置
3. 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
4. django-admin startapp app名称 # 创建app linux环境下使用django-admin.py
5. 在app中的models.py中定义好模型,这个模型必须继承自django.db.models
6. 将这个app添加到settings.py的INSTALLED_APP中
7. 在项目根目录执行如下三个命令
python manage.py migrate # 创建表结构
python manage.py makemigrations app名称 # 生成迁移脚本文件
python manage.py migrate app名称 #将迁移脚本文件映射到数据库中
在 myFirstDjango/
创建文件 testdb.py
,并添加如下内容
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from models.models import Book
# 数据库操作
def testdb(request):
test1 = Book(name='西游记', author='吴承恩', price=19.88)
test1.save()
return HttpResponse("数据添加成功!
")
在 myFirstDjango/urls.py
中添加testdb
的路由映射
from django.urls import path
from . import testdb
# 此项就是django的url配置
urlpatterns = [
# 添加路由 testdb,并绑定视图为 testdb.testdb
path('testdb', testdb.testdb)
]
启动服务,访问 http://localhost:8080/testdb
,结果输出如下
修改 myFirstDjango/testdb.py
内容如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""
from django.http import HttpResponse
from models.models import Book
# 数据库操作
def testdb(request):
# 初始化
response = ""
response1 = ""
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Book.objects.all()
# filter相当于SQL中的WHERE,可设置条件过滤结果
response2 = Book.objects.filter(id=1)
# 获取单个对象
response3 = Book.objects.get(id=1)
# 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
response4 = Book.objects.order_by('name')[0:2]
# 数据排序
response5 = Book.objects.order_by("id")
# 上面的方法可以连锁使用
response6 = Book.objects.filter(name="runoob").order_by("id")
# 输出所有数据
for var in list:
response1 += var.name + " " + var.author + " " + str(var.price) + " " + str(var.pub_time)
response = response1
return HttpResponse(""
+ response + "")
启动服务,访问 http://localhost:8080/testdb
,结果输出如下
修改数据可以使用 save() 或 update():
修改 myFirstDjango/testdb.py
内容如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""
from django.http import HttpResponse
from models.models import Book
def testdb(request):
# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
test1 = Book.objects.get(id=1)
test1.name = '红楼梦'
test1.save()
# 另外一种方式
# Book.objects.filter(id=1).update(name='水浒传')
# 修改所有的列
# Book.objects.all().update(name='三国演义')
return HttpResponse("修改数据成功
")
启动服务,访问 http://localhost:8080/testdb
,结果输出如下
修改 myFirstDjango/testdb.py
内容如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author: JinWenChao
@file: testdb
@time: 2020/12/3 9:25
"""
from django.http import HttpResponse
from models.models import Book
# 数据库操作
def testdb(request):
# 删除id=1的数据
test1 = Book.objects.get(id=1)
test1.delete()
# 另外一种方式
# Book.objects.filter(id=1).delete()
# 删除所有数据
# Book.objects.all().delete()
return HttpResponse("删除数据成功
")
启动服务,访问 http://localhost:8080/testdb
,结果输出如下