Django基础5——ORM中间程序

news2024/12/25 22:33:38

文章目录

  • 一、基本了解
  • 二、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效率问题。
    在这里插入图片描述

二、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 = 0
        except:
            msg = "用户添加失败,请检查!"
            code = 1
        return 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 User

User.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 serializers
    obj = 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 json
    obj = User.objects.all()     ##返回的是pathon的QuerySet对象。
    l = []   ##[{},{}]     ##是一个列表,里面包含多个字典。
    for i in obj:
        d = {}
        d['name'] = i.name
        d['user'] = i.user
        d['label'] = i.label
        l.append(d)
    json_data = json.dumps(l)
    return HttpResponse(json_data)

在这里插入图片描述

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

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

相关文章

【人脸考勤项目】

本项目主要是基于Opencv完成的人脸识别的考勤系统 人脸检测器的5种实现方法 方法一&#xff1a;haar方法进行实现&#xff08;以下是基于notebook进行编码&#xff09; # 步骤 # 1、读取包含人脸的图片 # 2.使用haar模型识别人脸 # 3.将识别结果用矩形框画出来# 导入相关包 …

自动驾驶感知传感器标定安装说明

1. 概述 本标定程序为整合现开发的高速车所有标定模块,可实现相机内参标定和激光、相机、前向毫米波 至车辆后轴中心标定,标定参数串联传递并提供可视化工具验证各个模块标定精度。整体标定流程如下,标定顺序为下图前标0-->1-->2-->3,相同编号标定顺序没有强制要求…

疲劳检测-闭眼检测(详细代码教程)

简介 瞌睡经常发生在汽车行驶的过程中&#xff0c;该行为害人害己&#xff0c;如果有一套能识别瞌睡的系统&#xff0c;那么无疑该系统意义重大&#xff01; 实现步骤 思路&#xff1a;疲劳驾驶的司机大部分都有打瞌睡的情形&#xff0c;所以我们根据驾驶员眼睛闭合的频率和…

微服务鉴权中心之网关配置SpringSecurity+oauth2

微服务鉴权中心流程如下&#xff1a; 1. 网关配置oauth2之TokenStore存储方式&#xff0c;此处用RedisTokenStore Configurationpublic class TokenConfig {Autowiredprivate RedisConnectionFactory redisConnectionFactory;Beanpublic TokenStore tokenStore() {return new …

生信分析Python实战练习 2 | 视频20

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

如何做好微信号标签管理?

微信除了生活外&#xff0c;也越来越多企业用微信来联系维护客户和发展自己的私域流量池&#xff0c;微信好友越加越多。 为了提高微信的管理效率&#xff0c;针对不同的微信好友群体进行群发&#xff0c;但每次都要手动打标签很费时间&#xff0c;那么有没有什么工具可以批量打…

Java项目01——项目配置

1. 前置知识&#xff1a; 1.把项目提交到本地仓库 2. gitee新建仓库&#xff0c;idea推送 3. 新建数据库&#xff0c;直接用navicate导入sql语句即可 4. 前后端联调&#xff0c;先编译&#xff0c;然后运行 5. 前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f…

【提升接口响应能力的最佳实践】常规操作篇

文章目录 1. 并行处理简要说明CompletableFuture是银弹吗&#xff1f;测试案例测试结论半异步&#xff0c;半同步总结 2. 最小化事务范围简要说明编程式事务模板 3. 缓存简要说明 4. 合理使用线程池简要说明使用场景线程池的创建参数的配置建议 线程池的监控线程池的资源隔离 5…

买卖股票的最佳时机 II【贪心策略】

买卖股票的最佳时机 II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的…

用wireshark流量分析的四个案例

目录 第一题 1 2 3 4 第二题 1 2 3. 第三题 1 2 第四题 1 2 3 第一题 题目&#xff1a; 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀&#xff08;加上下划线例如abc&#xff09; 4.…

【力扣】盛最多水的容器

目录 题目 题目初步解析 水桶效应 代码实现逻辑 第一步 第二步 第三步 代码具体实现 注意 添加容器元素的函数 计算迭代并且判断面积是否是最大值 总代码 运行结果 总结 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是…

GB28181学习(一)——总述

概念 GB28181全称是“公共安全视频监控联网系统信息传输、交换、控制技术要求”&#xff0c;它定义了视频监控设备之间的联网通信协议&#xff0c;旨在实现视频监控系统的互联互通和统一管理。 架构 GB28181协议的基本架构包括设备端和平台端。 设备端&#xff1a;包括视频监…

广告行业小程序搭建教程,零基础也能轻松上手

随着移动互联网的发展和智能手机的普及&#xff0c;小程序成为了各行业推广和服务的利器。对于广告行业来说&#xff0c;拥有一个专属的小程序不仅能提升企业形象&#xff0c;还可以方便用户查看广告、咨询服务等。那么&#xff0c;如何简单操作一键搭建广告行业小程序呢&#…

小区物业业主管理信息系统设计的设计与实现(论文+源码)_kaic

摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方向而改变&#xff0c;所以纯人工管理方式在越来越完善的现代化管理技术的比较之下也就显得过于繁琐&#x…

SpringCloud超详细教程

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

WEBRTC 的RTP/RTCP的 NACK, PLI,SLI,FIR

1&#xff0c;概述 在网络环境不是太好的情况下&#xff0c;比如网络拥塞比较严重&#xff0c;丢包率可能比较高&#xff0c;简单实用NACK重传的机制&#xff0c;这样就会有大量的RTCP NACK报文&#xff0c;发送端收到相应的报文&#xff0c;又会发送大量指定的RTP报文&#xf…

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…

Premiere Pro软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe Premiere Pro&#xff0c;简称PR&#xff0c;是Adobe公司开发的一款非线性视频编辑软件&#xff0c;被广泛应用于电影、电视剧、广告、纪录片、独立电影和音乐会等影视制作领域。它被公认为是行业内的标准工具&#xff0c…

陶哲轩6000字详述:计算机辅助数学证明的历史

导读 几个世纪以来&#xff0c;计算机&#xff08;机器&#xff09;一直是数学家的好朋友&#xff0c;他们利用它计算、提出猜想以及进行数学证明。随着交互式定理证明器、机器学习算法和生成式AI等更为先进的工具的出现&#xff0c;机器被更具创新性和深度的方式得到运用。 近…

深度学习3. 强化学习-Reinforcement learning | RL

强化学习是机器学习的一种学习方式&#xff0c;它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 目录 什么是强化学习&#xff1f; 强化学习的应用场景 强化学习的主流算法 强化学习(reinforcement learning) …