赞
踩
欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中
pip install mysqlclient
ORM功能:
创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】
操作表中的数据(不用写SQL语句)。
简单来说,ORM可以理解为普通话 ,sql语句是方言,ORM是一种sql语句的翻译,主要缺点是不能创建数据库,优点是书写起来简单高效。(运行效率不保证)
启动MySQL服务
自带工具创建数据库
create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
在项目的setting.py中修改数据库配置DATABASES
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 驱动
'NAME': 'day15', # 数据库名字
'USER': 'root', # mysql用户名
'PASSWORD': '123456', # mysql密码
'HOST': '127.0.0.1', # 本机安装了MySQL
'PORT': 3306, # 端口
}
}
所有的操作都需要在已经注册的app中的moudle.py中编写ORM语句,如下图app01就是已经注册好的,编写其中的moudle.py
在项目根目录(根目录下有一个manage.py的文件,在最外层)下cmd执行下方代码,按照注册的app顺序从上到下依次执行各个app的moudle.py文件。
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations
执行成功后出现文件夹内容:
python manage.py migrate
python manage.py makemigrations appname
python manage.py migrate appname
python manage.py migrate appname 文件名
注意,我们的app注册列表默认有很多官方默认的app,因此第一次操作数据库也会生成很多官方内置的表,我们学习时只需要关注自己新建的表即可。
from django.db import models
class UserInfo(models.Model):#一个类就是一个表
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
# 上面的UserInfo代码等价于下面的代码
# CREATE TABLE `app01_userinfo` (
# `id` bigint NOT NULL AUTO_INCREMENT,
# `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
# `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
# PRIMARY KEY (`id`) USING BTREE
# )
观察新建的表,默认给我们添加一个id主键
在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:
1,手动输入一个值。
设置默认值
age = models.IntegerField(default=2)
允许为空
data = models.IntegerField(null=True, blank=True)
moudle.py内容
from django.db import models
class UserInfo(models.Model):#一个类就是一个表
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=2)#新增了这一列
# 上面的UserInfo代码等价于下面的代码
# CREATE TABLE `app01_userinfo` (
# `id` bigint NOT NULL AUTO_INCREMENT,
# `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
# `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
# `age` int NOT NULL,
# PRIMARY KEY (`id`) USING BTREE
# )
先新建一个部门表,然后再执行插入数据,不然会报错不存在部门表,这一步要分开来操作两次。
from django.db import models
class UserInfo(models.Model):#一个类就是一个表
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=2)#新增了这一列
class Department(models.Model):# 新建一个部门类
title = models.CharField(max_length=16)#部门名称
-执行cmd命令建表后
from django.db import models class UserInfo(models.Model):#一个类就是一个表 name = models.CharField(max_length=32) password = models.CharField(max_length=64) age = models.IntegerField(default=2)#新增了这一列 class Department(models.Model):# 新建一个部门类 title = models.CharField(max_length=16)#部门名称 # #### 1.插入数据 #### Department.objects.create(title="销售部") Department.objects.create(title="IT部") Department.objects.create(title="运营部") UserInfo.objects.create(name="武沛齐", password="123", age=19) UserInfo.objects.create(name="朱虎飞", password="666", age=29) UserInfo.objects.create(name="吴阳军", password="666")
一般情况下,建议新建一个orm网页用于快速测试,避免繁琐的使用命令行,这样只需要打开orm即可执行语句
这里注意,不能在moudle.py中删除数据,会报错django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
原因未知。
from app01.models import Department, UserInfo
def orm(request):
# #### 2.删除 ####
UserInfo.objects.filter(id=3).delete()
Department.objects.all().delete()
return HttpResponse("成功")
# #### 3.修改数据 ####
UserInfo.objects.all().update(password=999)#把所有人的密码改为999
UserInfo.objects.filter(id=2).update(age=999)#把id为2的记录的年纪改为999
UserInfo.objects.filter(name="朱虎飞").update(age=999)#把name为朱虎飞的记录年纪改为999
from django.db import models class UserInfo(models.Model):#一个类就是一个表 name = models.CharField(max_length=32) password = models.CharField(max_length=64) age = models.IntegerField(default=2)#新增了这一列 class Department(models.Model):# 新建一个部门类 title = models.CharField(max_length=16)#部门名称 # #### 4.查询数据 #### # 4.1 获取符合条件的所有数据 # data_list = [对象,对象,对象] QuerySet类型 data_list = UserInfo.objects.all()#一个数据列表 print("遍历打印所有") for obj in data_list:# print(obj.id, obj.name, obj.password, obj.age) #data_list = [对象,] data_list = UserInfo.objects.filter(id=1) print(data_list)#打印第一条 #4.2 获取第一条数据【对象】 row_obj = UserInfo.objects.filter(id=1).first() print("打印row_obj的各列数据") print(row_obj.id, row_obj.name, row_obj.password, row_obj.age)
url.py 添加url
# 案例:用户管理
path('info/list/', views.info_list),#展示用户列表
path('info/add/', views.info_add),#添加用户
path('info/delete/', views.info_delete),#删除用户
def info_list(request):
# 1.获取数据库中所有的用户信息
# [对象,对象,对象]
data_list = UserInfo.objects.all()
# 2.渲染,返回给用户
return render(request, "info_list.html", {"data_list": data_list})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>INFO列表</h1> <table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>密码</th> <th>年龄</th> <th>操作</th> </tr> </thead> <tbody> {% for obj in data_list %} <tr> <td>{{ obj.id }}</td> <td>{{ obj.name }}</td> <td>{{ obj.password }}</td> <td>{{ obj.age }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
修改原来的用户展示列表,新增一个添加用户按钮<a href="/info/add/">添加</a>
,用于跳转到用户添加页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>INFO列表</h1> <a href="/info/add/">添加</a> <table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>密码</th> <th>年龄</th> <th>操作</th> </tr> </thead> <tbody> {% for obj in data_list %} <tr> <td>{{ obj.id }}</td> <td>{{ obj.name }}</td> <td>{{ obj.password }}</td> <td>{{ obj.age }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
def info_add(request):
if request.method == "GET":
return render(request, 'info_add.html')
# 获取用户提交的数据
user = request.POST.get("user")
pwd = request.POST.get("pwd")
age = request.POST.get("age")
# 添加到数据库
UserInfo.objects.create(name=user, password=pwd, age=age)
# 自动跳转
# return redirect("http://127.0.0.1:8000/info/list/")
return redirect("/info/list/")#上一行写法的简化
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>添加用户</h1> <form method="post"> {% csrf_token %} {# 注意不要忘了csrf!!! #} <input type="text" name="user" placeholder="用户名"> <input type="text" name="pwd" placeholder="密码"> <input type="text" name="age" placeholder="年龄"> <input type="submit" value="提交"> </form> </body> </html>
修改原来的用户展示列表,新增一个添加用户按钮<a href="/info/delete/?nid={{ obj.id }}">删除</a>
,用于删除用户
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>INFO列表</h1> <a href="/info/add/">添加</a> <table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>密码</th> <th>年龄</th> <th>操作</th> </tr> </thead> <tbody> {% for obj in data_list %} <tr> <td>{{ obj.id }}</td> <td>{{ obj.name }}</td> <td>{{ obj.password }}</td> <td>{{ obj.age }}</td> <td> <a href="/info/delete/?nid={{ obj.id }}">删除</a> </td> </tr> {% endfor %} </tbody> </table> </body> </html>
# http://127.0.0.1:8000/info/delete/?nid=1
# http://127.0.0.1:8000/info/delete/?nid=2
# http://127.0.0.1:8000/info/delete/?nid=3
def info_delete(request):
nid = request.GET.get('nid')#获取get传来的id
UserInfo.objects.filter(id=nid).delete()#根据指定id删除
return redirect("/info/list/")#跳转回到用户列表页面
大家喜欢的话,给个
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。