当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:
- 创建数据库,设计表结构和字段;
- 使用 MySQLdb 来连接数据库,并编写数据访问层代码;
- 业务逻辑层去调用数据访问层执行数据库操作。
ORM的概念
ORM:Object Relational Mapping(对象关系映射),是使用面向对象的思维来操作数据库。
python中类名 --------------对应---------->数据库中的表名
python类属性 -----------对应--------->数据库里的字段
python类实例------------对应--------->数据库表里的一行数据
obj.id obj.name.....
类实例对象的属性。
在django中,根据代码中的类自动生成数据库的表也叫–code first
Django orm的优势:
-
Django的orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;
-
所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite…,如果数据库迁移,只需要更换Django的数据库引擎即可。
常用字段
-
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。 -
IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。 -
CharField
字符类型,必须提供max_length参数, max_length表示字符长度。 -
DateField
日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。 -
DateTimeField
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
一、将用户保存到数据库(增)
- 创建模型类,生成对应的数据库表格
models.py 文件:
from django.db import models
class Person(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, null=False, unique=True)
age = models.IntegerField()
birthday = models.DateField() # 日期, YYYY-MM-DD
def __str__(self):
msg = 'name:{}'.format(self.name)
return msg
class Meta():
db_table = 'person' # 修改数据库中表格的名称为 person
- 将表单数据保存到数据库
格式:类名.objects.create()
类实例化:obj=models.类(属性=XX)
obj.save()
页面显示 add_person.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加用户</title>
</head>
<body>
<form action="/app01/add_person/" method="post">
{% csrf_token %}
<p>
用户名: <input type="text" name="username">
</p>
<p>
年龄: <input type="text" name="age">
</p>
<p>
生日: <input type="text" name="bir">
</p>
<p>
<input type="submit" value="添加">
</p>
</form>
</body>
</html>
views.py 文件:
def add_person(request):
# 1.判断请求方式
if request.method == 'POST':
# 2. 获取表单提交过来的数据
usrname = request.POST.get('username')
age = request.POST.get('age')
bir = request.POST.get('bir')
# 3. 保存到数据库
models.Person.objects.create(name=usrname, age=age, birthday=bir)
# 重定向到所有用户页面
return redirect('/app01/all_person/')
return render(request, 'app01/add_person.html')
二、显示用户列表
语法: 类名.objects.all()
获取所有记录
views.py 文件:
def all_person(request):
"""展示所有的用户"""
# 1.查询数据库中所有的记录
person_lst = models.Person.objects.all() # 获取所有对象
# print(person_lst)
# <QuerySet [<Person: Person object (3)>]> 是QuerySet类型的列表,当成list使用。
# 2.展示到页面上
return render(request, 'app01/all_person.html', {'person_lst': person_lst})
all_person.html
文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/app01/add_person/">添加用户</a>
<table border="1">
<tr>
<td>序号</td>
<td>id</td>
<td>姓名</td>
<td>年龄</td>
<td>生日</td>
<td>操作</td>
</tr>
{% for person in person_lst %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ person.id }}</td>
<td>{{ person.name }}</td>
<td>{{ person.age }}</td>
<td>{{ person.birthday|date:'Y-m-d' }}</td>
<td>
<a href="/app01/edit_person/?id={{ person.id }}">修改</a>
<a href="/app01/delete_person/?id={{ person.id }}">删除</a>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
三、删除用户
(1)语法:
①类名.objects.get(xxx).delete()
②类名.objects.filter(xxx).delete()
views.py 文件:
def delete_person(request):
"""根据id删除用户"""
# 1.获取表单传递过来的id
ids = request.GET.get('id')
# print(id)
# 2.删除数据库中对应的记录
# person_obj = models.Person.objects.get(id=ids) # 获取 person对象
# print(person_obj) # Person object (3)
# person_obj.delete() # 删除数据库中的记录
ret = models.Person.objects.filter(id=ids) # filter() 根据条件进行过滤。
ret.delete()
print(ret) # <QuerySet [<Person: Person object (3)>]>
# 3.删除成功后,重定向到展示所有用户的界面
return redirect('/app01/all_person/')
模板已经在上面写出
四、修改用户
**
(1)语法:
①
obj =类名.objects.get(‘xxx’)
obj.zz = xx
obj.save()
②类名.objects.filter(‘xxx’).update(关键字(类中的属性)=值.....)
def edit_person(request):
"""修改用户"""
if request.method == 'POST':
# 1.获取提交过来的数据
usrname = request.POST.get('username')
age = request.POST.get('age')
bir = request.POST.get('bir')
# 2.根据唯一标识去数据库中查询出对象
# id = request.POST.get('id')
# person_obj = models.Person.objects.get(id=id)
# # 对象重新赋值
# # 3.再将新的数据赋值给对象
# person_obj.name = usrname
# person_obj.age = age
# person_obj.birthday = bir
# person_obj.save() # 将对象保存到数据库
# 第二种方式保存修改数据:使用filter() 返回 QuerySet 集合,使用 update() 方法。
id = request.POST.get('id')
models.Person.objects.filter(id=id).update(name=usrname, age=age, birthday=bir)
# 修改成功后重定向到所有用户页面
return redirect('/app01/all_person/')
else:
"""get 请求"""
# 1.获取 表单提交过来的id
id = request.GET.get('id')
# 2. 根据id去数据库中查询记录
person_obj = models.Person.objects.get(id=id)
# 3. 显示到页面上
return render(request, 'app01/edit_person.html', {'person_obj': person_obj})
edit_person.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改用户</title>
</head>
<body>
<form action="/app01/edit_person/" method="post">
<p>
<input type="hidden" name="id" value="{{ person_obj.id }}">
</p>
{% csrf_token %}
<p>
用户名: <input type="text" name="username" value="{{ person_obj.name }}">
</p>
<p>
年龄: <input type="text" name="age" value="{{ person_obj.age }}">
</p>
<p>
生日: <input type="text" name="bir" value="{{ person_obj.birthday|date:'Y-m-d' }}">
</p>
<p>
<input type="submit" value="保存">
</p>
</form>
</body>
</html>