Django-(二).模型层
一、ORM:
ORM将一个Python的对象映射为数据库中的一张关系表。它将SQL封装起来,程序员不再需要关心数据库的具体操作,只需要专注于自己本身代码和业务逻辑的实现。
于是,整体的实现过程就是:Python代码,通过ORM转换成SQL语句,再通过pymysql去实际操作数据库。
优点:
a. 简单,不用自己写SQL语句
b. 开发效率高
缺点:
a. 记忆你这个特殊的语法
b. 相对于大神些的SQL语句,肯定执行效率有差距
二、ORM的对应关系:
类 ---> 数据表
对象 ---> 数据行
属性 ---> 字段
三、ORM能做的事儿:
a. 操作数据表 --> 创建表/删除表/修改表
操作models.py里面的类
b. 操作数据行 --> 数据的增删改查
四、使用Django的ORM详细步骤:
a. 自己动手创建数据库 (不能创建数据库,自己动手创建数据库)
create database 数据库名;
b. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 连接的数据库类型
'HOST': '127.0.0.1', # 连接数据库的地址
'PORT': 3306, # 端口
'NAME': "day61", # 数据库名称
'USER': 'root', # 用户
'PASSWORD': '123456' # 密码
}
}
- 告诉Django用pymysql代替默认的MySQLDB 连接MySQL数据库
在项目/init.py文件中,写下面两句:
import pymysql
# 告诉Django用pymysql来代替默认的MySQLdb
pymysql.install_as_MySQLdb()
- 在app下面的models.py文件中定义一个类,这个类必须继承models.Model
class UserInfo(models.Model):
id = models.AutoField(primary_key=True) # 创建一个自增的主键字段
name = models.CharField(null=False, max_length=32) # 创建一个varchar(20)类型的不能为空的字段
def __str__(self):
return "<{}-{}>".format(self.id, self.name) #默认属性
# print(models.UserInfo.objects.all())
# <QuerySet [<UserInfo: <1-a>>, <UserInfo: <2-b>>, <UserInfo: <3-c>>, <UserInfo: <4-c>>, <UserInfo: <5-d>>, <UserInfo: <6-e>>, <UserInfo: <7-f>>]>
- 执行两个命令
a. python3 manage.py makemigrations #记录models文件的变动
b. python3 manage.py migrate #翻译记录并执行sql
对数据进行增删改查
1.查询数据库中的数据
models.UserInfo.objects.all()
models.UserInfo.objects.all().values('user') #只取user列
models.UserInfo.objects.all().values_list('id','user') #取出id和user列,并生成一个列表
models.UserInfo.objects.get(id=1)
models.UserInfo.objects.get(user='yangmv')
from app01 import models #加入models
def user(request):
user = models.UserInfo.objects.all() #与models中UserInfo类建立联系,并获取所有的用户
return render(request, 'user_list.html', {'user_list': user}) #将数据替换到html中
user.list.html页面代码:
<tbody>
{% for user in user_list %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
</tr>
{% endfor %}
</tbody>
添加数据(通过POST请求)
models.UserInfo.objects.create(user='yangmv',pwd='123456')
或者
obj = models.UserInfo(user='yangmv',pwd='123456')
obj.save()
或者
dic = {'user':'yangmv','pwd':'123456'}
models.UserInfo.objects.create(**dic)
# 添加用户的函数
def add_user(request):
if request.method == "POST": #查看请求的方法
# 用户填写了新的用户名,并发送了POST请求过来
new_name = request.POST.get("username", None)
# 去数据库中新创建一条用户记录
models.UserInfo.objects.create(name=new_name)
# return HttpResponse("添加成功!")
# 添加成功后直接跳转到用户列表页
return redirect("/user_list/")
# 第一个请求页面的时候,就返回一个页面,页面上有两个框让用户填写
return render(request, "user_list.html")
user_list.html页面代码:
<form action="/add_user/" method="post">
<p>用户名:
<input type="text" name="username">
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
删除数据
用户点击是GET请求,通过GET获取id来执行删除操作
models.UserInfo.objects.filter(user='yangmv').delete()
<td>
<a href="/delete/?id={{ user.id }}">删除</a>
</td>
def delete_user(request):
print(request) #<WSGIRequest: GET '/delete/?id=10'> 在html中定义
print(request.GET) #<QueryDict: {'id': ['10']}>
print("=" * 120)
del_id = request.GET.get("id", None) #对字典用get取值,如果没有返回None
print(del_id) #9
if del_id:
models.UserInfo.objects.get(id=del_id).delete()
return redirect("/user_list/")
else:
return HttpResponse("要删除的数据不存在!")
编辑数据
models.UserInfo.objects.filter(user='yangmv').update(pwd='520')
或者
obj = models.UserInfo.objects.get(user='yangmv')
obj.pwd = '520'
obj.save()
通过user_list.html,选择要修改的数据,进去edit.html
为了在修改栏中显示默认的数据,利用url传递id参数,随后生成edit_obj 对象传入到edit.html,通过edit_obj对象在html中显示id以及原始数据
在edit.html修改数据,edit.html中name接受新数据,id负责在函数中获取原始数据