Django模型
Django对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django为这些数据库提供了统一的调用API。
Django ORM
Django模型使用自带的ORM
对象关系映射(Object Relational Mapping,简称ORM)用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM在业务逻辑层和数据库之间充当了桥梁的作用。
ORM是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中,
使用ORM的好处:
- 提高开发效率
- 不同数据库可以平滑切换
缺点:
- ORM代码转换为SQL语句时,需要花费一定的时间,执行效率会有所降低。
ORM解析过程
- 1、ORM会将Python代码转换为SQL语句
- 2、SQL语句通过pymysql传送到数据库服务端
- 3、在数据库中执行SQL语句并将结果返回
ORM对应关系表
数据库配置
创建MySQL数据库(ORM无法操作到数据库级别,只能操作到数据表)语法:
create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8
项目settings.py文件中找到DATABASES配置项
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'HelloWorld', # 数据库名称
'HOST': 'localhost', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'root', # 数据库密码
}
}
定义模型
Django规定,如果要使用模型,必须要创建一个app,使用名创建TestModel的app
django-admin.py startapp TestModel
tree目录如下
HelloWorld
|-- HelloWorld
|-- manage.py
...
|-- TestModel
| |-- __init__.py
| |-- admin.py
| |-- models.py
| |-- tests.py
| `-- views.py
修改TestModel/models.py文件
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
以上的类名代表了数据库表明,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据库类型则有CharField(相当于varchar)、DateField(相当于datetime),max_length参数限定长度。
接下来在settings.py中找到INSTALLED_APPS
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', # 添加此项
)
命令行中运行
$ python manage.py migrate # 创建表结构
$ python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate TestModel # 创建表结构
注:即使没有在models给表设置主键,Django也会自动添加一个id作为主键
数据库操作
在HelloWorld目录中添加testdb.py文件,并修改urls.py
from django.urls import path
from . import views,testdb
urlpatterns = [
path('runoob/', views.runoob),
path('testdb/', testdb.testdb),
]
添加数据
添加数据需要先创建对象,然后再执行save函数,相当于SQL中的INSERT:
# HelloWorld/HelloWorld/testdb.py
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
test1 = Test(name='so')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
获取数据
Django提供多种方式来获取数据库的内容
# HelloWorld/HelloWorld/testdb.py
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
# 初始化
response = ""
response1 = ""
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Test.objects.all()
# filter相当于SQL中的WHERE,可设置条件过滤结果
response2 = Test.objects.filter(id=1)
# 获取单个对象
response3 = Test.objects.get(id=1)
# 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
Test.objects.order_by('name')[0:2]
#数据排序
Test.objects.order_by("id")
# 上面的方法可以连锁使用
Test.objects.filter(name="so").order_by("id")
# 输出所有数据
for var in list:
response1 += var.name + " "
response = response1
return HttpResponse("<p>" + response + "</p>")
更新数据
修改数据可以使用save()或update()
# HelloWorld/HelloWorld/testdb.py
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
test1 = Test.objects.get(id=1)
test1.name = 'Google'
test1.save()
# 另外一种方式
# Test.objects.filter(id=1).update(name='Google')
# 修改所有的列
# Test.objects.all().update(name='Google')
return HttpResponse("<p>修改成功</p>")
删除数据
# HelloWorld/HelloWorld/testdb.py
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
# 删除id=1的数据
test1 = Test.objects.get(id=1)
test1.delete()
# 另外一种方式
# Test.objects.filter(id=1).delete()
# 删除所有数据
# Test.objects.all().delete()
return HttpResponse("<p>删除成功</p>")