Django学习之orm框架

八、Django学习之orm框架


其他关于Python Web开发笔记:(如果遇到问题可以一起交流~)

一、Flask学习之HTML-CSDN博客

二、Flask学习之CSS-CSDN博客

【接上篇】二、Flask学习之CSS(下篇)-CSDN博客

三、Flask学习之BootSrap-CSDN博客

四、Flask学习之JavaScript-CSDN博客

五、Flask学习之MySQL-CSDN博客

六、Django学习之小试牛刀-CSDN博客

七、Django学习之预备知识-CSDN博客

首先安装第三方模块:

pip install mysqlclient

然后创建数据库,具体方法参见:五、Flask学习之MySQL-CSDN博客

1.Django连接数据库

打开Django项目中的settings.py文件修改配置,找到DATABASE,然后修改:

DATABASES = {"default": {"ENGINE": "django.db.backends.mysql",	# 设置MySQL引擎,Django会自动连接数据库"NAME": "mydatabase", 					# 你自己的数据库的名称"USER": "root",							# 数据库用户名"PASSWORD": "mypassword", 				# 你的mysql密码"HOST": "127.0.0.1",  					# 本机回环地址"PORT": 3306,       					# 数据库端口  }
}

2.Django对数据表操作

打开自己创建好的app下的models.py文件,输入以下语句用于创建表格:

class UserInfo(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)age = models.IntegerField()

Django会将这些代码转换成MySQL语句,等价于:

create table myapp01_userinfo(id bigint primary key auto_increment, -- Django会自动加上这一列name varchar(34),password varchar(64),age int
);

然后启用终端,使用你的Django项目的Python解释器环境,进入到你的项目的根目录下,输入以下代码:

python manage.py makemigrations
pyhton manage.py migrate

在运行第一条指令的时候,可能会出现django.db.utils.NotSupportedError: MySQL 8 or later is required这个报错信息,原因是你本地安装的MySQL数据库是5.0版本的而Django的新版本只支持8.0 版本的MySQL。

解决方案如下:

找到你的Django项目的Python解释器位置,然后进入以下路径:

\Lib\site-packages\django\db\backends\base

找到base.py,把第239行代码注释掉,这行代码的作用是检查你的数据库是否支持,注释掉就可以了。

image-20240128225512226

然后就能正常运行上面的两条指令了:

image-20240128230224504

然后你就会发现你的数据库多出来了很多表格:

image-20240128230351291

这些表格是Django帮你创建的。

如果你后续还要添加新的表,就在models.py里面创建好类以后,再次执行上面的两条指令就可以了。

如果你后续是在已经创建过的表格中再加入字段,会提示你有两个选项(因为有可能那张表已经有数据了),选第一个,会让你输入一个默认值,会把那张表中的新添加的字段默认值设置为你输入的;如果选第二个会直接退出程序,然后多加一个参数就可以设置默认值:age = models.IntegerField(default=999)

3.Django对数据表进行增删改查

新建一个url用来测试增删改查操作,我这里命名为orm:

在urls.py新增:

path("orm/", views.orm)

然后再views.py里面添加函数:

def orm(request):return HttpResponse("操作成功!")

3.1. 增

新建表数据使用的语句格式为:

# 要先导入对应的类才能操作
from myapp01.models import UserInfo
# Models里面的类名(数据表).objects.create(各种值)
# 例如:
def orm(request):# 1.增UserInfo.objects.create(name="panda", password="123465", age=20)UserInfo.objects.create(name="小红", password="111111", age=21)UserInfo.objects.create(name="小明", password="222222", age=22)return HttpResponse("操作成功!")

运行之后,检查数据表的数据是否已经添加上:

image-20240129120335854

3.2. 删

删除某条目的语句格式为:

# fileter()里面装的是筛选条件
UserInfo.objects.filter(id=3).delete()

删除全部条目的语句为:

UserInfo.objects.all().delete()

运行之后,检查数据表中数据是否被删除:

image-20240129120841276

3.3. 改

修改某条目的语句格式为:

UserInfo.objects.filter(id=5).update(name="大白")

运行之后,检查数据表中数据是否被修改:

在这里插入图片描述

3.4. 查

获取所有的数据:

data_list = UserInfo.objects.all()

获得的结果是一个列表,列表中的每一个元素都是一个对象,代表着数据表中的一行数据:

for each in data_list:print(each)

image-20240129125418459

如果想访问它的值,就可以使用.运算符:

for each in data_list:print(each.name, each.password, each.age)

image-20240129125548189

查询数据可以添加一定条件,比如:

data = UserInfo.objects.filter(id=5)

但是返回的结果仍然是一个列表,就算只有一条数据也是返回的列表。如果已经确定只有一条数据,那么就可以使用一下语句,返回的结果只是一个对象:

data = UserInfo.objects.filter(id=5).first()

4.案例

4.1. 显示用户列表

在urls.py新增:

path("info/list/", views.info_list)

然后再views.py里面添加函数:

def info_list(request):# 获取用户信息data_list = UserInfo.objects.all()return render(request, "info_list.html", {"data_list": data_list})

然后在templates里面新建info_list.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body>
<div><table border="1"><thead><tr><th>ID</th><th>用户名</th><th>密码</th><th>年龄</th></tr></thead><tbody>{% for each in data_list %}<tr><td>{{ each.id }}</td><td>{{ each.name }}</td><td>{{ each.password }}</td><td>{{ each.age }}</td></tr>{% endfor %}</tbody></table>
</div>
</body>
</html>

运行结果:

在这里插入图片描述

4.2. 添加用户

在urls.py新增:

path("info/add/", views.info_add)

然后再views.py里面添加函数:

def info_add(request):if request.method == "GET":return render(request, "info_add.html")# 获取用户提交的数据username = request.POST.get("username")passwd = request.POST.get("passwd")age = request.POST.get("age")# 添加到数据库UserInfo.objects.create(name=username, passwd=passwd, age=age)return redirect("/info/list")

然后在templates里面新建info_add.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post" action="/info/add/">{% csrf_token %}用户名:<input type="text" name="username" placeholder="请输入用户名......">密 码:<input type="password" name="passwd" placeholder="请输入密码......">年 龄:<input type="text" name="age" placeholder="请输入年龄......"><input type="submit" value="提 交">
</form>
</body>
</html>

运行结果:

image-20240129190142155

点击提交后会自动跳转:

image-20240129190315115

4.3. 删除用户

在urls.py新增:

path("info/del/", views.info_del)

然后再views.py里面添加函数:

def info_add(request):if request.method == "GET":return render(request, "info_add.html")# 获取用户提交的数据username = request.POST.get("username")passwd = request.POST.get("passwd")age = request.POST.get("age")# 添加到数据库UserInfo.objects.create(name=username, passwd=passwd, age=age)return redirect("/info/list")

修改templates里面的info_list.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body>
<div><table border="1"><thead><tr><th>ID</th><th>用户名</th><th>密码</th><th>年龄</th><th>操作</th></tr></thead><tbody>{% for each in data_list %}<tr><td>{{ each.id }}</td><td>{{ each.name }}</td><td>{{ each.password }}</td><td>{{ each.age }}</td><td><a href="/info/del/?the_id={{ each.id }}">删除</a></td></tr>{% endfor %}</tbody></table>
</div>
</body>
</html>

效果:

在这里插入图片描述

当点击删除时,会执行删除操作,并自动跳转到列表界面:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/440240.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTFSQL注入(部分)

原来靶场不是最折磨的&#xff0c;新手做ctf才是 1.[极客大挑战 2019]LoveSQL 我一共做了三题&#xff0c;先来讲里面最简单的题吧 看见一个登录框&#xff0c;先尝试注入&#xff0c;发现会报错&#xff0c;而且不过滤# &#xff0c;于是就开始常规操作 1 union select 1,d…

3985. 辗转相除法

一、题目 Problem #3985 - ECNU Online Judge 二、思路 第一眼还以为是最基本的欧几里得&#xff0c;然后一个劲地在那里找合适的一组整数&#xff0c;找了一会没找到&#xff0c;后面直接用随机查找一下子找到了 三、代码 import sun.misc.GC;import java.util.Random; impo…

类和对象 第五部分第六小节:函数调用运算符重载

1、函数调用运算符&#xff08;&#xff09;可以重载 由于重载后使用方式非常像函数的调用&#xff0c;因此称此为仿函数 代码案例&#xff1a;打印输出仿函数 #include<iostream> using namespace std; class MyPrint { public://重载函数调用运算符void operator()(str…

2分钟快速了解!全网最详细的性能测试教程之【Redis 简介和安装】

本篇文章主要介绍基于Redis的的简介和安装&#xff0c;其中参考了许多大佬写的文章&#xff0c;算是做一个Redis的基础教程吧。 Redis 简介 Redis 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 Redis 与其他 key - value 缓存产品有…

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

2024情人节爱心表白--python代码

# coding=utf-8 import random import turtle from datetime import *# 抬起画笔,向前运动一段距离放下 def Skip(step):turtle.penup()turtle.forward(step)turtle

学会用Python分割、合并字符串

在很多情况下&#xff0c;我们需要对字符串进行分割或合并&#xff0c;以满足特定的需求&#xff0c;例如将字符串拆分成多个部分、将多个字符串合并成一个等等。Python提供了多种方法来进行字符串的分割和合并&#xff0c;本文将介绍其中几种常用的方法。 一、使用split()函数…

git仓库批量备份

git的mirror参数 在git中&#xff0c;--mirror是一个用于克隆和推送操作的参数。它用于创建一个镜像仓库&#xff0c;包含了源仓库的所有分支、标签和提交历史记录。 当使用git clone --mirror <source-repo>命令时&#xff0c;会创建一个完全相同的镜像仓库&#xff0…

promethues之POD搭建

服务自动发现 consonl node主机发现 kube-api自动发现 prometheus的容器化部署 mdkir prometheus cd prometheus mdkir node cd node vim node.yaml apiVersion: apps/v1 kind: DaemonSet metadata:name: node-exporternamespace: monitor-salabels:name: node-exporter sp…

Shell中sed编辑器

1.简介 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么从命令行中输入&#xff0c;要么存储在一个 命令文本文件中。 2.sed编辑器的工作流程 sed…

实战教程:如何用Spring Boot和MySQL存储共享单车数据

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

STM32学习笔记一——初识STM32

目录 一、什么是ARM 二. Cortex 内核 三.什么是STM32 四.STM32核心板原理图&#xff1a; 五.STM32的内部结构&#xff1a; 六.stm32系统结构简化图 STM32基本原理分析&#xff1a; 七.典型型号——STM32F103ZET6 stm32——32位单片机&#xff08;数据总线是32位的&am…