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负责在函数中获取原始数据