对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。——百度百科
简而言之,ORM就是面向对象语言使用关系型数据库的中转站。ORM能使开发人员专注于业务逻辑,减少开发人员的负担,但是ORM的缺点也很明显,效率不高。
在Django中使用ORM需要在APP下面的models.py文件中写类,例如:
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=32) # CharField生成数据库的VARCHAR类型。
password = models.CharField(max_length=128)
然后执行数据库迁移命令:
python manage.py makemigrations #检测所有APP下面的models的变化,将变更记录制作成迁移文件。
python manage.py migrate #数据库迁移。
执行上面两条命令之后的结果大概如下所示。
然后在数据库中添加两条数据。
现在,我们在上次创建的myapp01下的views.py文件中,更改index函数如下所示。
def index(request): # index函数
from myapp1 import models # 导入models
obj = models.User.objects.all() # 获取数据库所有数据
for i in obj:
print(i.username, i.password) # 打印数据库中的数据
return render(request, "index.html")
然后进入index页面,刷新页面。就可以看到在控制台有如下的输出。
当然,我们也可以获取指定的数据,代码如下:
def index(request): # index函数
from myapp1 import models # 导入models
obj = models.User.objects.all() # 获取数据库所有数据
for i in obj:
print(i.username, i.password) # 打印数据库中的数据
ret = models.User.objects.get(username="zy") # get方法获取一条数据。
print(ret.password)
return render(request, "index.html")
注意,get方法获取不到数据以及获取到多条数据的时候报错。
我们有另外的方法filter。它可以获取多条数据。代码如下。
def index(request): # index函数
from myapp1 import models # 导入models
obj = models.User.objects.all() # 获取数据库所有数据
for i in obj:
print(i.username, i.password) # 打印数据库中的数据
# ret = models.User.objects.get(username="zy") # get方法获取一个对象。
ret = models.User.objects.filter(password="123") # filter方法获取多个数据。如果数据不存在,那么返回空列表。
print(ret[0].username)
print(ret[1].username)
return render(request, "index.html")
来,看一下控制台的输出。
那么,既然我们已经懂了这么多东西了,现在,我们更改myapp1下面的views.py文件如下所示。
from django.shortcuts import render, HttpResponse, redirect
from myapp1 import models # 导入models
# Create your views here.
def login(request): # login函数
if request.method == "GET": # 前端如果是get请求
return render(request, 'login.html') # 返回HTML页面。
elif request.method == "POST": # 前端如果是post请求
username = request.POST.get("username") # 获取POST请求中的username值
password = request.POST.get("password") # 获取密码值
ret = models.User.objects.filter(username=username, password=password)
# if username == "zy" and password == "12345":
if ret:
return redirect("/index/")
else: # 如果用户名或者密码错误,返回登录页面
return render(request, "login.html")
def index(request): # index函数
return render(request, "index.html")
现在,我们的登录页面发送的数据就可以在数据库中查找了。