Django基础5——ORM中间程序

文章目录

  • 一、基本了解
  • 二、ORM基本操作
    • 2.1 连接数据库
      • 2.1.1 使用sqlite数据库
      • 2.1.2 使用MySQL数据库
    • 2.2 对数据库操作
      • 2.2.1 增(前端数据——>数据库)
      • 2.2.2 查(数据库——>前端展示)
      • 2.2.3 改(修改数据)
      • 2.2.3 删(删除数据)
  • 三、配置管理后台
    • 3.1 登陆后台
    • 3.2 创建用户
    • 3.3 注册模型
    • 3.4 设置语言和时区
  • 四、模型类
    • 4.1 模型Meta类与方法
    • 4.2 常用字段&字段选项
    • 4.3 QuerySet序列化

一、基本了解

静态网站&动态网站:

  1. 静态网站是从本地读取数据,完全由html模板提供的静态数据。
  2. 动态网站是从数据库读取数据,由动态网页中包含的程序输出结果。
    在这里插入图片描述

ORM作用:

  • 动态网站中的数据是从数据库中返回的,在django就是由ORM中间程序对数据库进行操作,把常规的SQL语句转化成独有的语法,继而拿到数据并返回给浏览器。
    在这里插入图片描述

ORM概念:

  • 对象关系映射(Object Relational Mapping,ORM):是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。简单来说就是在编程语言中实现的一种虚拟对象数据库。我们对虚拟对象数据库进行操作,它会转换成具体的SQL去操作数据库,这样一来我们就不需要学习复杂的SQL语句了。

ORM优势:

  • ORM优势就是不必熟悉复杂的SQL语句,容易上手,避免新手写SQL效率问题。
    在这里插入图片描述
  • Django默认创建的数据库表。
表名作用
auth_user用户表
auth_user_groups用户所属组的表
auth_user_user_permissions用户权限表
auth_group用户组表
auth_group_permissions用户组权限表
auth_permission存放全部权限的表,其他的表的权限都是从此表中外键连接过去的
django_session保存HTTP状态
django_migrations数据库迁移记录

二、ORM基本操作

2.1 连接数据库

2.1.1 使用sqlite数据库

  • Django默认使用的数据库是sqlite3,一般用于数据测试,生产环境还是建议使用mysql或oracle。
  • sqlite数据库是一个文件级别的数据库,所有数据都存放在一个文件中。

1.定义数据库表,在app/models.py文件中定义。

from django.db import models##定义一个模型类,自定义类名称User
class User(models.Model):user = models.CharField(max_length=30) #用户名name = models.CharField(max_length=30) #姓名sex = models.CharField(max_length=10)  #性别age = models.IntegerField()            #年龄label = models.CharField(max_length=100) #标签

2.在settings.py配置文件中INSTALLED_APPS列表添加APP名称。

##创建一个app,名为myapp
python manage.py startapp myapp

在这里插入图片描述
3.将模型类生成具体的数据库表。

##生成迁移文件, 是一个更偏向sql语句的执行文件,文件位置在myapp\migrations\0001_initial.py。
python manage.py makemigrations##执行迁移文件生成表。
python manage.py migrate

在这里插入图片描述
4.进入数据库查看表。生成表名的默认格式:应用名_模型类名小写。
在这里插入图片描述

2.1.2 使用MySQL数据库

1.使用docker启动一个mysql实例,模拟生产环境中的mysql数据库。

docker run -d \
--name qingjun \
-p 3306:3306 \
-v mysqldata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 --character-set-server=utf8

在这里插入图片描述
2.使用pip工具安装pymysql模块。

pip install pymysql

3.修改django默认连接数据库。

##修改文件devops/settings.py
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'test','USER': 'root','PASSWORD': '123456','HOST': '192.168.161.132','PORT': '3306',}
}

4.指定数据库驱动。

##操作文件myapp/__init__.py,添加以下内容。
import pymysql
pymysql.install_as_MySQLdb()

5.执行迁移文件生成表。

python manage.py migrate

6.mysql数据库查看表。
在这里插入图片描述

2.2 对数据库操作

2.2.1 增(前端数据——>数据库)

1.代码示例。

#######################################################
1、操作文件ORM/urls.py下添加。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [path('admin/', admin.site.urls),path('myapp/',include('myapp.urls'))
]#######################################################
2、操作文件ORM/myapp/urls.py
from django.urls import path,include
from myapp import views
urlpatterns = [path('user_add',views.user_add)
]#######################################################
3、操作文件ORM/myapp/views.py
from django.shortcuts import render,HttpResponse
from myapp.models import User   ##导入模型类
def user_add(request):##向数据库插入一条数据。User.objects.create(user='qingjun',name='卿君',sex='男',age='35',label="IT,讲师,热爱健身")return render(request, 'user_add.html')#######################################################
4、操作文件templates/user_add.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>新用户注册</title>
</head>
<body>
<form action="" method="post"><h1>注册用户</h1>用户名 : <input type="text" name="user"><br>姓名 : <input type="text" name="name"><br>性别 : <input type="text" name="sex"><br>年龄 : <input type="text" name="age"><br>标签 : <input type="text" name="label"><br><button type="submit">提交</button>
</form>
</body>
</html>

2.浏览器访问http://127.0.0.1:8000/myapp/user_add,访问一次就执行一遍视图函数,就往数据库写一遍数据。
在这里插入图片描述
3.查看数据库表数据。
在这里插入图片描述
4.修改视图函数代码,变成在网页表单中填入信息可以提交到数据库。

#######################################################
##操作文件ORM/myapp/views.py
from django.shortcuts import render,HttpResponse
from myapp.models import User   ##导入模型类
def user_add(request):if request.method == "GET":return render(request, 'user_add.html')elif request.method == "POST":#获取前端表单提交的数据user = request.POST.get("user")name = request.POST.get("name")sex = request.POST.get("sex")age = request.POST.get("age")label = request.POST.get("label")try:User.objects.create(    ##方式一写法。user=user,name=name,sex=sex,age=age,label=label)obj = User(            ##方式二写法。user=user,name=name,sex=sex,age=age,label=label)msg = "用户添加成功!!!"code = 0except:msg = "用户添加失败,请检查!"code = 1return render(request, 'user_add.html',{'msg': msg, 'code': code})#######################################################
##操作文件templates/user_add.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>新用户注册</title>
</head>
<body>
<form action="" method="post"><h1>注册用户</h1>用户名 : <input type="text" name="user"><br>姓名 : <input type="text" name="name"><br>性别 : <input type="text" name="sex"><br>年龄 : <input type="text" name="age"><br>标签 : <input type="text" name="label"><br><button type="submit">提交</button>{% if code == 0 %}<p style="color:blue;">{{ msg }}</p>{% elif code == 1 %}<p style="color: red">{{ msg }}</p>{% endif %}
</form>
</body>
</html>

在这里插入图片描述
5.前端提交表单数据到数据库。
在这里插入图片描述
在这里插入图片描述

2.2.2 查(数据库——>前端展示)

1.示例代码。

#######################################################
1、操作文件ORM/urls.py下添加。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [path('admin/', admin.site.urls),path('myapp/',include('myapp.urls'))
]#######################################################
2、操作文件ORM/myapp/urls.py
from django.urls import path,include
from myapp import views
urlpatterns = [path('user_add',views.user_add),path('user_list',views.user_list)     ##添加此行。
]#######################################################
3、操作文件ORM/myapp/views.py
from django.shortcuts import render,HttpResponse
from myapp.models import User   ##导入模型类
def user_list(request):user_list = User.objects.all()return render(request, "user_list.html", {'user_list': user_list})#######################################################
4、操作文件templates/user_list.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>数据查询</title>
</head>
<body>
<table border="1"><thead><tr><th>用户名</th><th>姓名</th><th>性别</th><th>年龄</th><th>标签</th></tr></thead><tbody>{% for i in user_list %}<tr><td>{{ i.user }}</td><td>{{ i.name }}</td><td>{{ i.sex }}</td><td>{{ i.age }}</td><td>{{ i.label }}</td></tr>{% endfor %}</tbody>
</body>
</html>

2.访问网页,查询数据库数据。
在这里插入图片描述
3.其他查询语句。

from myapp.models import UserUser.objects.all() # 获取所有记录
User.objects.filter(user="qingjun") # 加条件获取记录,例如字段是多少
User.objects.filter(age__gt=20) # 加条件获取记录,例如年龄大于多少
User.objects.get(id=2) # 获取单条记录,id是唯一

在这里插入图片描述

2.2.3 改(修改数据)

  • 修改id=2的数据。

1.修改之前。
在这里插入图片描述
2.修改之后。

##方式一。
User.objects.filter(id=2).update(user='baimu',name='柏木',sex='女',label='公关,漂亮,喜欢购物')##方式二。
obj = User.objects.get(id=2)
obj.age = 25
obj.save()

在这里插入图片描述

2.2.3 删(删除数据)

1.删除id=3的数据。

##方式一。
User.objects.filter(id=3).delete()##方式二。
obj = User.objects.get(id=2)
obj.delete()

2.查看数据。
在这里插入图片描述

三、配置管理后台

  • 管理后台:一个网站一般都会开发一个后台系统,为管理员提供一种更简单的数据库操作方式,不然每次修改数据都需要输入代码修改。

3.1 登陆后台

1.访问Django后台管理页面。

from django.contrib import admin # 内建管理后台功能
from django.urls import path
urlpatterns = [path('admin/', admin.site.urls), # 内建管理后台访问地址
]

在这里插入图片描述
2.创建管理员账号。

python manage.py createsuperuser

在这里插入图片描述
3.登录后台管理系统。
在这里插入图片描述

3.2 创建用户

1.创建新用户,并授权登录。
在这里插入图片描述
在这里插入图片描述
2.新用户登录。

在这里插入图片描述

3.3 注册模型

1.注册模型,让数据库的数据显示到后台管理系统中。

##修改文件myapp/admin.py
from django.contrib import admin
from myapp import models
admin.site.register(models.User)

在这里插入图片描述
2.可以直接修改数据库数据。
在这里插入图片描述

3.4 设置语言和时区

1.修改django配置文件。

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

在这里插入图片描述
2.查看效果。
在这里插入图片描述

四、模型类

4.1 模型Meta类与方法

  • Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。
常用属性选项描述
app_label指定APP名称,当模型类不在默认的APP的models.py文件中,这时需要指定模型类是属于哪个APP。
db_table指定生成的数据库表名称,默认是”应用名_模型名”
ordering对象的默认顺序,值是一个列表或元组。
元素是一个字符串表示字段名,元素前面带减号表示倒序,没有表示升序,问号表示随机排序
例如ordering = [“-sex”]
verbose_name定义一个易读的模型名称,默认会加一个复数s
verbose_name_plural定义一个易读的模型名称,不带复数s

1.verbose_name用法,优化前端模型名称显示为英文问题。

##myapp/models.py文件添加class User(models.Model):......##添加以下代码。class Meta:app_label = "myapp"    ##模型类标签。db_table ="myapp_user"  #自定义生成的数据库表名verbose_name="用户表"   #前端显示为"用户表"verbose_name_plural="用户表"  #优化前端显示问题,去掉复数形式

在这里插入图片描述
2.优化用户表名显示成python对象问题。

##myapp/models.py文件添加
class User(models.Model):......class Meta:......##添加以下代码。ordering = ["user"]  # 对象的默认顺序,用于获取对象列表时def __str__(self):return self.user  # 返回字段值

在这里插入图片描述

4.2 常用字段&字段选项

字段类型描述
AutoField(**options)ID自动递增,会自动添加到模型中
BooleanField(**options)布尔值字段(true/false),默认值是None
CharField(max_length=None[,**options])存储各种长度的字符串
EmailField([max_length=254,**options])邮件地址,会检查是否合法
FileField([upload_to=None,max_length=100,**options])保存上传文件。upload_to是保存本地的目录路径
FloatField([**options])浮点数
IntegerField([**options])整数
GenericIPAddressField(protocol=’both’, unpack_ipv4=False, **options)IP地址
TextField([**options])大文本字符串
URLField([max_length=200,**options])字符串类型的URL
DateTimeField([auto_now=False,auto_now_add=False,**options])日期和时间
1、auto_now=True时,第二次保存对象时自动设置为当前时间。用于最后一次修改的时间戳,比如更新。
2、auto_now_add=True时,第一次创建时自动设置当前时间。用于创建时间的时间戳,比如新增。
这两个参数互斥,不能写到一个字段里,分开定义字段用。
DateField([auto_now=False,auto_now_add=False,**options])日期
TimeField([auto_now=False,auto_now_add=False,**options])时间
字段选项描述
null如果为True,字段用NULL当做空值,默认False
blank如果为True,允许为空,默认False
db_index如果为True,为此字段建立索引
default字段的默认值
primary_key如果为True,设置为主键
unique如果为True,保持这个字段的值唯一
verbose_name易读的名称,管理后台会以这个名称显示
  • 添加时间日期。

1.给数据库表添加时间日志字段。

##myapp/models.py文件添加
class User(models.Model):......create_datetime = models.DateTimeField(auto_now_add=True, blank=True, null=True)   ##第一次创建时间update_datetime = models.DateTimeField(auto_now=True, blank=True, null=True)    ##更新时间##生成迁移文件,并同步该文件。
python manage.py makemigrations
python manage.py migrate

在这里插入图片描述
2.verbose_name用法,优化显示前端用户名称。
在这里插入图片描述
在这里插入图片描述

4.3 QuerySet序列化

  • 序列化:将Python对象转为传输的数据格式.

  • 反序列化:将传输的数据格式转为Python对象

  • ORM查询返回的是QuerySet对象,有两种方法可以转为JSON字符串:

    • 使用内建函数 serializers
    • 遍历QuerySet对象将字段拼接成字典,再通过json库编码

1.使用函数serializers转换为JSON格式。

#######################################################
1、操作文件ORM/urls.py下添加。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [path('admin/', admin.site.urls),path('myapp/',include('myapp.urls'))
]#######################################################
2、操作文件ORM/myapp/urls.py
from django.urls import path,include
from myapp import views
urlpatterns = [path('api',views.api)
]#######################################################
3、操作文件ORM/myapp/views.py
from django.shortcuts import render,HttpResponse
from myapp.models import User   ##导入模型类
def api(request):from django.core import serializersobj = User.objects.all()data = serializers.serialize('json', obj)return HttpResponse(data)

在这里插入图片描述
2.配合json库遍历查询,优势是可以自定义返回内容。

#######################################################
1、操作文件ORM/urls.py下添加。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [path('admin/', admin.site.urls),path('myapp/',include('myapp.urls'))
]#######################################################
2、操作文件ORM/myapp/urls.py
from django.urls import path,include
from myapp import views
urlpatterns = [path('api',views.api)
]#######################################################
3、操作文件ORM/myapp/views.py
from django.shortcuts import render,HttpResponse
from myapp.models import User   ##导入模型类
def api(request):import jsonobj = User.objects.all()     ##返回的是pathon的QuerySet对象。l = []   ##[{},{}]     ##是一个列表,里面包含多个字典。for i in obj:d = {}d['name'] = i.named['user'] = i.userd['label'] = i.labell.append(d)json_data = json.dumps(l)return HttpResponse(json_data)

在这里插入图片描述

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

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

相关文章

已知两地经纬度,计算两地直线距离

文章目录 1 原理公式2 代码实现2.1 JavaScript2.2 C2.3 Python2.4 MATLAB 1 原理公式 在地球上&#xff0c;计算两点之间的直线距离通常使用地理坐标系&#xff08;例如WGS84&#xff09;。计算两地直线距离的公式是根据经纬度之间的大圆距离&#xff08;Great Circle Distanc…

C语言练习4(巩固提升)

C语言练习4 选择题 前言 面对复杂变化的世界&#xff0c;人类社会向何处去&#xff1f;亚洲前途在哪里&#xff1f;我认为&#xff0c;回答这些时代之问&#xff0c;我们要不畏浮云遮望眼&#xff0c;善于拨云见日&#xff0c;把握历史规律&#xff0c;认清世界大势。 选择题 …

shell常用脚本

1、Java项目重启脚本 #!/bin/bash# 定义一个函数来结束进程和启动新进程 function restart(){JAR_NAME$1 # jar包LOG_NAME$2 # 日志JVM_ARGS$3 # jvm 参数PID$(ps -ef | grep java | grep ${JAR_NAME} | awk { print $2 })if [[ ! -z "$PID" ]]; thenecho "…

postgresql-字符函数

postgresql-字符函数 字符串连接字符与编码字符串长度大小写转换子串查找与替换截断与填充字符串格式化MD5 值字符串拆分字符串反转 字符串连接 concat(str, …)函数用于连接字符串&#xff0c;并且忽略其中的 NULL 参数&#xff1b;concat_ws(sep, str, …) 函数使用指定分隔…

【黑科技】游戏开发程序员必备工具【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;效率…

递归算法学习——子集

目录 一&#xff0c;题目解析 二&#xff0c;例子 三&#xff0c;题目接口 四&#xff0c;解题思路以及代码 1.完全深度搜索 2.广度搜索加上深度优先搜索 五&#xff0c;相似题 1.题目 2.题目接口 3.解题代码 一&#xff0c;题目解析 给你一个整数数组 nums &#xff0c…

软件开发的201个原则 阅读笔记 第172-201个原则

目录 原则172 做项目总结 第8章 产品保证原则 原则173 产品保证并不是奢侈品 原则 174 尽早建立软件配置管理过程 原则175 使软件配置管理适应软件过程 原则176 组织SCM 独立于项目管理 原则 177 轮换人员到产品保证组织 给所有中间产品一个名称和版本 原则179 控制基准 原则…

学习JAVA打卡第四十五天

StringBuffer类 StringBuffer对象 String对象的字符序列是不可修改的&#xff0c;也就是说&#xff0c;String对象的字符序列的字符不能被修改、删除&#xff0c;即String对象的实体是不可以再发生变化&#xff0c;例如&#xff1a;对于 StringBuffer有三个构造方法&#xff…

PHP敬老院管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 敬老院管理系统&#xff08;养老&#xff09;是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 论文 https://download.csdn.net/download/qq_41221322/…

财务部发布《企业数据资源相关会计处理暂行规定》

导读 财务部为规范企业数据资源相关会计处理&#xff0c;强化相关会计信息披露&#xff0c;根据《中华人民共和国会计法》和相关企业会计准则&#xff0c;制定了《企业数据资源相关会计处理暂行规定》。 加gzh“大数据食铁兽”&#xff0c;回复“20230828”获取材料完整版 来…

adb 命令

1.adb shell dumpsys activity top | find "ACTIVITY" 查看当前运行的activity包名 2.adb shell am start -n 包名/页面名 打开应用的页面 3.查看将要启动或退出app的包名 adb shell am monitor 只有在启动或退出的时候才会打印 4.查看当前启动应用的包名 ad…

工单管理报修系统有什么用?的修工单系统助您解决报修难点

随着互联网的快速发展&#xff0c;许多企业都开始使用“的修”工单管理系统&#xff0c;这是一款企业管理软件&#xff0c;可以帮助管理员用户针对不同的机构、单位以及外部客户的需求来选择性地管理、维护及追踪各种各样的问题和请求&#xff0c;也可用作公司内部员工工作上的…

人员闯入检测告警算法

人员闯入检测告警算法通过yolov5网络模型识别检测算法&#xff0c;人员闯入检测告警算法对未经许可或非法进入的人员进行及时识别告警&#xff0c;确保对危险区域的安全管理和保护。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位…

SSM - Springboot - MyBatis-Plus 全栈体系(二)

第一章 Maven 三、Maven 核心功能依赖和构建管理 1. 依赖管理和配置 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程…

【Docker】01-Centos安装、简单使用

参考教程&#xff1a; https://www.bilibili.com/video/BV1Qa4y1t7YH/?p5&spm_id_frompageDriver&vd_source4964ba5015a16eb57d0ac13401b0fe77 什么是Docker&#xff1f; Docker是一种开源的容器化平台&#xff0c;用于构建、打包、部署和运行应用程序。它通过使用容…

Java面向对象

目录 1. 对象简介 2. this关键字 3. 构造器&#xff08;构造方法&#xff09; 4. 封装性 5. 实体类JavaBean 6. 静态&#xff08;static&#xff09; 7. 工具类 8. 继承 9. 权限修饰符 10. 方法重写 11. this和super的用法总结&#xff1a; 12. 多态 13. final关键…

Midjourney学习(二)参数的基础

prompt的组成 prompt 可以由三部分组成&#xff0c; 第一部分是垫图部分&#xff0c;也就是一张网络图片 第二部分是文本描述内容 第三部分则是参数 参数列表 --aspect <value> 或者 --ar <value> 控制画面的比例&#xff0c;横竖比例 --version <value> -…

centos安装MySQL 解压版完整教程(按步骤傻瓜式安装

一、卸载系统自带的 Mariadb 查看&#xff1a; rpm -qa|grep mariadb 卸载&#xff1a; rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 二、卸载 etc 目录下的 my.cnf 文件 rm -rf /etc/my.cnf 三、检查MySQL是否存在 有则先删除 #卸载mysql服务以及删除所有mysql目录 #没…

day-05 TCP半关闭 ----- DNS ----- 套接字的选项

一、优雅的断开套接字连接 之前套接字的断开都是单方面的。 &#xff08;一&#xff09;基于TCP的半关闭 Linux的close函数和windows的closesocket函数意味着完全断开连接。完全断开不仅不能发送数据&#xff0c;从而也不能接收数据。在某些情况下&#xff0c;通信双方的某一方…

【CSS左右上角斜标签】CSS实现左右上角飘带功能,左右上角斜标签(附源码)

文章目录 写在前面涉及知识点实现效果1、实现过程1.1左上角飘带Html代码Css代码效果 1.2右上角飘带Html代码Css代码效果 2、源码分享2.1 百度网盘2.2 123网盘2.3 邮箱留言 总结 写在前面 其实在公司页面开发过程就遇到过&#xff0c;需要在方块右上角展示一个斜的文字或者告警…