DRF讲解

1. 什么是 Django 和 Django REST Framework?

在深入 ModelViewSet 之前,我们先简单了解一下背景知识:

  • Django 是一个基于 Python 的 Web 开发框架,旨在帮助开发者快速构建安全、可扩展的 Web 应用。它遵循“不要重复自己”(DRY)和“快速开发”的原则,提供了许多内置功能,比如 ORM(对象关系映射)、用户认证、模板引擎等。
  • Django REST Framework (DRF) 是 Django 的扩展库,专门用于构建 RESTful API。它让开发者可以轻松地将 Django 模型转换为 API 端点,供前端或其他服务调用。
  • ViewSet 是 DRF 提供的一种高级视图类,ModelViewSet 是其中最常用的子类,用于处理模型的 CRUD(创建、读取、更新、删除)操作。

2. 什么是 ModelViewSet

ModelViewSet 是 Django REST Framework 中的一个类,位于 rest_framework.viewsets 模块。它是一个高度抽象的工具,集成了处理模型数据的所有常见操作(CRUD),让你只需编写很少的代码,就能实现完整的 API 功能。

核心特点:

  • 自动生成 CRUD 端点ModelViewSet 自动为你的模型提供以下 HTTP 方法对应的操作:
    • GET:列表(list)和详情(retrieve
    • POST:创建(create
    • PUT/PATCH:更新(update/partial_update
    • DELETE:删除(destroy
  • 代码简洁:通过继承 ModelViewSet,你只需指定模型和序列化器(Serializer),就能自动生成这些功能。
  • 灵活性:可以自定义行为,比如添加权限、过滤、排序等。

3. 使用 ModelViewSet 的步骤

创建一个简单的“任务管理”应用,包含任务(Task)的增删改查功能。

3.1 准备工作

环境要求
  • 已安装 Python 3(推荐 3.8 或更高版本)
  • 已安装 Django 和 Django REST Framework:
    pip install django djangorestframework
    
创建 Django 项目
  1. 创建一个新的 Django 项目:
    django-admin startproject task_manager
    cd task_manager
    
  2. 创建一个 Django 应用:
    python manage.py startapp tasks
    
  3. tasks 应用和 rest_framework 添加到 task_manager/settings.pyINSTALLED_APPS 中:
    INSTALLED_APPS = [...'rest_framework','tasks',
    ]
    

3.2 定义模型

tasks/models.py 中定义一个简单的 Task 模型:

from django.db import modelsclass Task(models.Model):title = models.CharField(max_length=200)description = models.TextField(blank=True)completed = models.BooleanField(default=False)created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.title
  • 解释
    • title:任务的标题,最大长度 200 个字符。
    • description:任务描述,允许为空。
    • completed:是否完成,默认为 False
    • created_at:创建时间,自动设置为当前时间。
    • __str__:返回任务的字符串表示,便于调试。

运行迁移命令以创建数据库表:

python manage.py makemigrations
python manage.py migrate

3.3 创建序列化器(Serializer)

序列化器负责将模型数据转换为 JSON 格式(或从 JSON 转换为模型)。在 tasks/serializers.py 中创建:

from rest_framework import serializers
from .models import Taskclass TaskSerializer(serializers.ModelSerializer):class Meta:model = Taskfields = ['id', 'title', 'description', 'completed', 'created_at']
  • 解释
    • ModelSerializer 是 DRF 提供的类,自动根据模型生成序列化逻辑。
    • Meta 类指定关联的模型(Task)和需要序列化的字段。
    • fields 列出要包含的字段,id 是 Django 模型自动生成的。

3.4 创建 ModelViewSet

tasks/views.py 中定义 ModelViewSet

from rest_framework import viewsets
from .models import Task
from .serializers import TaskSerializerclass TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializer
  • 解释
    • queryset:指定视图使用的查询集,这里是所有 Task 对象。
    • serializer_class:指定序列化器,用于处理输入输出数据。
    • ModelViewSet 自动提供了 listretrievecreateupdatepartial_updatedestroy 方法。

3.5 配置路由

为了让 API 可访问,需要将 TaskViewSet 注册到路由中。在 task_manager/urls.py 中:

from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from tasks.views import TaskViewSet# 创建路由器并注册 ViewSet
router = DefaultRouter()
router.register(r'tasks', TaskViewSet)urlpatterns = [path('admin/', admin.site.urls),path('api/', include(router.urls)),
]
  • 解释
    • DefaultRouter 是 DRF 提供的工具,自动为 ModelViewSet 生成 URL 路由。
    • router.register 注册 TaskViewSet,并将 URL 前缀设为 tasks
    • include(router.urls) 将路由纳入主 URL 配置,API 端点将以 /api/tasks/ 开头。

3.6 测试 API

  1. 启动 Django 开发服务器:
    python manage.py runserver
    
  2. 访问 http://127.0.0.1:8000/api/tasks/,你会看到 DRF 提供的交互式 API 界面。
  3. 测试以下功能:
    • GET /api/tasks/:列出所有任务。
    • POST /api/tasks/:创建新任务(通过 JSON 提交 {"title": "新任务", "description": "描述", "completed": false})。
    • GET /api/tasks/1/:获取 ID 为 1 的任务详情。
    • PUT /api/tasks/1/:更新 ID 为 1 的任务。
    • DELETE /api/tasks/1/:删除 ID 为 1 的任务。

4. 深入理解 ModelViewSet

4.1 ModelViewSet 的默认行为

ModelViewSet 继承了多个 Mixin 类,提供了以下方法:

方法HTTP 方法功能URL 示例
listGET返回所有对象的列表/api/tasks/
retrieveGET返回单个对象的详情/api/tasks/1/
createPOST创建新对象/api/tasks/
updatePUT更新现有对象(整体更新)/api/tasks/1/
partial_updatePATCH部分更新对象/api/tasks/1/
destroyDELETE删除对象/api/tasks/1/

这些方法由 ModelViewSet 自动实现,你无需手动编写。


4.2 自定义 ModelViewSet

虽然 ModelViewSet 提供了默认实现,但你可以通过重写方法或添加属性来自定义行为。以下是一些常见自定义场景:

示例 1:添加权限控制

限制只有登录用户可以访问 API。在 tasks/views.py 中:

from rest_framework import viewsets, permissions
from .models import Task
from .serializers import TaskSerializerclass TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializerpermission_classes = [permissions.IsAuthenticated]  # 要求登录
  • 解释permission_classes 指定只有通过认证的用户才能访问 API。
  • 需要在 settings.py 中启用认证:
    REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.SessionAuthentication','rest_framework.authentication.BasicAuthentication',],
    }
    
示例 2:过滤查询集

只显示当前用户的任务:

class TaskViewSet(viewsets.ModelViewSet):serializer_class = TaskSerializerpermission_classes = [permissions.IsAuthenticated]def get_queryset(self):return Task.objects.filter(owner=self.request.user)
  • 解释:重写 get_queryset 方法,根据当前用户过滤任务。
  • 需要在 Task 模型中添加 owner 字段:
    from django.contrib.auth.models import User
    class Task(models.Model):owner = models.ForeignKey(User, on_delete=models.CASCADE)...
    
示例 3:自定义序列化器行为

假设你想在 list 操作时只返回部分字段:

class TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()def get_serializer_class(self):if self.action == 'list':return TaskListSerializer  # 自定义序列化器return TaskSerializerclass TaskListSerializer(serializers.ModelSerializer):class Meta:model = Taskfields = ['id', 'title']  # 仅返回 id 和 title
  • 解释get_serializer_class 允许根据请求类型(action)动态选择序列化器。

6. 常见问题解答

Q1:为什么使用 ModelViewSet 而不是普通视图?
A:ModelViewSet 提供了开箱即用的 CRUD 功能,减少重复代码。对于快速开发 API 或原型,它非常高效。如果需要更多自定义,可以使用普通的 APIViewGenericAPIView

Q2:如何处理复杂的 API 逻辑?
A:可以重写 ModelViewSet 的方法(如 createupdate)或使用自定义动作(@action 装饰器)。

Q3:如何学习更多高级功能?
A:学习 DRF 的权限、过滤、分页和认证系统。尝试实现 token 认证(使用 rest_framework.authtoken 或 JWT)。


在这里插入图片描述

面试题

简单题目 (2 道)

1. 什么是 ModelViewSet,它在 Django REST Framework 中有什么作用?

问题描述:请简要说明 ModelViewSet 的定义以及它在构建 API 时的主要功能。

答案提示

  • ModelViewSet 是 Django REST Framework 提供的一个高级视图类,继承自 GenericViewSet 和多个 Mixin(如 CreateModelMixinListModelMixin 等)。
  • 它自动为模型提供 CRUD 操作(创建、读取、更新、删除)的 API 端点。
  • 通过指定 querysetserializer_class,可以快速生成 RESTful API。
  • 示例:class TaskViewSet(viewsets.ModelViewSet): queryset = Task.objects.all(); serializer_class = TaskSerializer

考察点:理解 ModelViewSet 的基本概念和用途。


2. 如何为 ModelViewSet 配置路由?

问题描述:说明如何使用 Django REST Framework 的路由器(Router)为 ModelViewSet 配置 URL 路由,并提供代码示例。

答案提示

  • 使用 rest_framework.routers.DefaultRouter 创建路由器。
  • 调用 router.register 方法注册 ModelViewSet,指定 URL 前缀和视图集。
  • 示例:
    from rest_framework.routers import DefaultRouter
    from .views import TaskViewSetrouter = DefaultRouter()
    router.register(r'tasks', TaskViewSet)
    urlpatterns = [path('api/', include(router.urls)),
    ]
    
  • 自动生成 /api/tasks/(列表和创建)和 /api/tasks/<id>/(详情、更新、删除)等端点。

考察点:掌握 ModelViewSet 与路由器的集成。


中等题目 (5 道)

3. 如何在 ModelViewSet 中限制查询集只返回当前用户的数据?

问题描述:假设有一个 Task 模型,包含 owner 字段(关联到 User 模型)。如何修改 TaskViewSet,使 GET /api/tasks/ 只返回当前登录用户的任务?

答案提示

  • 重写 get_queryset 方法,根据 self.request.user 过滤查询集。
  • 示例:
    class TaskViewSet(viewsets.ModelViewSet):serializer_class = TaskSerializerpermission_classes = [permissions.IsAuthenticated]def get_queryset(self):return Task.objects.filter(owner=self.request.user)
    
  • 需要确保用户已登录(IsAuthenticated 权限)。

考察点:理解 get_queryset 的动态过滤和权限控制。


4. 如何在 ModelViewSet 中为不同操作使用不同的序列化器?

问题描述:在 TaskViewSet 中,list 操作只需要返回 idtitle,而其他操作需要返回所有字段。如何实现?

答案提示

  • 重写 get_serializer_class 方法,根据 self.action 返回不同的序列化器。
  • 示例:
    class TaskListSerializer(serializers.ModelSerializer):class Meta:model = Taskfields = ['id', 'title']class TaskSerializer(serializers.ModelSerializer):class Meta:model = Taskfields = '__all__'class TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()def get_serializer_class(self):if self.action == 'list':return TaskListSerializerreturn TaskSerializer
    

考察点:掌握 get_serializer_class 的动态选择机制。


5. 如何在 ModelViewSet 中添加自定义动作?

问题描述:为 TaskViewSet 添加一个自定义动作 mark_completed,通过 POST /api/tasks/<id>/mark_completed/ 将任务标记为已完成。提供代码示例。

答案提示

  • 使用 @action 装饰器定义自定义动作。
  • 示例:
    from rest_framework.decorators import action
    from rest_framework.response import Responseclass TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializer@action(detail=True, methods=['post'])def mark_completed(self, request, pk=None):task = self.get_object()task.completed = Truetask.save()serializer = self.get_serializer(task)return Response(serializer.data)
    
  • detail=True 表示该动作针对单个对象,URL 为 /api/tasks/<id>/mark_completed/

考察点:理解 @action 装饰器和自定义端点的实现。


6. 如何在 ModelViewSet 中实现分页?

问题描述:当任务列表很长时,如何为 TaskViewSetlist 操作启用分页,每页显示 10 条记录?

答案提示

  • settings.py 中配置全局分页,或在 ViewSet 中指定分页类。
  • 示例(全局配置):
    # settings.py
    REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 10
    }
    
  • 或者在 ViewSet 中:
    class TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializerpagination_class = PageNumberPaginationpage_size = 10
    
  • 访问 /api/tasks/?page=2 获取第二页数据。

考察点:掌握 DRF 的分页机制和配置。


7. 如何为 ModelViewSet 添加过滤功能?

问题描述:如何让 TaskViewSet 支持通过查询参数过滤任务,例如 GET /api/tasks/?completed=true 只返回已完成的任务?

答案提示

  • 使用 DRF 的 django-filter 扩展或自定义过滤。
  • 安装 django-filterpip install django-filter
  • 示例:
    # settings.py
    INSTALLED_APPS = [... , 'django_filters']
    REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
    }# views.py
    class TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializerfilterset_fields = ['completed']
    
  • 访问 /api/tasks/?completed=true 即可过滤。

考察点:理解 DRF 的过滤后端和 django-filter 的使用。


难题 (3 道)

8. 如何在 ModelViewSet 中实现复杂的权限控制?

问题描述:假设 Task 模型有一个 is_private 字段。只有任务的拥有者或超级用户可以查看/编辑私有任务(is_private=True),其他用户只能访问非私有任务。如何实现?

答案提示

  • 创建自定义权限类,继承 permissions.BasePermission
  • 示例:
    from rest_framework import permissionsclass TaskPermission(permissions.BasePermission):def has_object_permission(self, request, view, obj):if not obj.is_private:return True  # 非私有任务对所有人可访问return obj.owner == request.user or request.user.is_superuserclass TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializerpermission_classes = [permissions.IsAuthenticated, TaskPermission]def get_queryset(self):if self.request.user.is_superuser:return Task.objects.all()return Task.objects.filter(models.Q(is_private=False) | models.Q(owner=self.request.user))
    
  • has_object_permission 控制单个对象的访问权限,get_queryset 过滤列表。

考察点:高级权限控制、自定义权限类和查询集过滤的结合。


9. 如何在 ModelViewSet 中处理嵌套序列化器?

问题描述:假设 Task 模型与 Category 模型通过外键关联(task.category)。如何在 TaskViewSet 中返回任务时包含分类的详细信息,而不是仅返回分类 ID?

答案提示

  • 在序列化器中使用嵌套序列化器。
  • 示例:
    # models.py
    class Category(models.Model):name = models.CharField(max_length=100)class Task(models.Model):title = models.CharField(max_length=200)category = models.ForeignKey(Category, on_delete=models.CASCADE)# serializers.py
    class CategorySerializer(serializers.ModelSerializer):class Meta:model = Categoryfields = ['id', 'name']class TaskSerializer(serializers.ModelSerializer):category = CategorySerializer(read_only=True)class Meta:model = Taskfields = ['id', 'title', 'category']# views.py
    class TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializer
    
  • 为支持创建/更新任务时接收分类 ID,需重写序列化器的 create/update 方法。

考察点:嵌套序列化器、只读字段和复杂数据结构的处理。


10. 如何优化 ModelViewSet 的性能?

问题描述:假设 TaskViewSetlist 操作需要处理大量数据(例如 10 万条任务记录),如何优化性能以减少响应时间?

答案提示

  • 分页:启用分页(参考题目 6),限制每次返回的记录数。
  • 选择性字段加载:使用 select_relatedprefetch_related 优化数据库查询。
    class TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.select_related('category').all()serializer_class = TaskSerializer
    
  • 缓存:使用 Django 的缓存框架或 DRF 的缓存装饰器。
    from rest_framework.decorators import cache_pageclass TaskViewSet(viewsets.ModelViewSet):queryset = Task.objects.all()serializer_class = TaskSerializer@cache_page(60 * 15)  # 缓存 15 分钟def list(self, request, *args, **kwargs):return super().list(request, *args, **kwargs)
    
  • 索引:在数据库中为常用查询字段(如 ownercompleted)添加索引。
  • 异步任务:对于耗时操作(如批量更新),使用 Celery 异步处理。

考察点:性能优化技巧,包括数据库查询优化、缓存和异步任务。

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

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

相关文章

TRAE IDE** 下载、安装、开发、测试和部署 2048 小游戏的全流程指南

以下是一份完整的 TRAE IDE 下载、安装、开发、测试和部署 2048 小游戏的全流程指南。整个过程基于 TRAE 作为 AI 辅助编程工具的特性&#xff08;对标 Cursor/AWS Kiro&#xff09;&#xff0c;假设它支持智能代码生成和云部署功能。 【插播】腾讯云AI Coding大赛https://mar…

重学前端005 --- 响应式网页设计 CSS 盒子模型

文章目录BOX 盒子概念CSSoverflow: hidden;filter: blur(3px);box-shadow: 0 0 3px 3px #efb762;border-radius: 30px 25px 60px 12px;transform: rotate(-0.6deg);每个 HTML 元素都是一个盒子&#xff0c;它拥有着自己的间距和边框。这叫作“盒子模型”。 BOX 盒子概念 内容…

TC500R立式加工中心主轴箱机械结构设计cad【11张】三维图+设计说明书

TC500R立式加工中心主轴箱机械结构设计 摘 要 数控机床作为工业制造的基础&#xff0c;在国家的发展中起着非常重要的作用。随着我国经济的快速发展&#xff0c;我国已经成为工业制造大国&#xff0c;制造业的发展离不开数控机床&#xff0c;而TC500R立式加工中心作为数控机床…

CSS Grid布局:构建现代网页的强大网格系统

目录 一、Grid布局基础概念 1.1 网格容器与网格项 1.2 创建基本网格 二、核心属性详解 2.1 定义网格轨道 2.2 网格间距控制 2.3 网格项对齐方式 三、实战布局技巧 3.1 创建经典布局 3.2 网格项定位技巧 3.3 响应式网格设计 四、Grid布局 vs Flexbox布局 五、高级…

Elasticsearch / MongoDB / Redis / MySQL 区别

1、一句话简介名称核心用途Elasticsearch强大的全文检索与日志分析引擎MongoDB灵活的文档数据库&#xff0c;适合半结构化/结构化数据Redis高性能的内存键值缓存数据库&#xff0c;用于实时高并发处理MySQL经典关系型数据库&#xff0c;强事务支持&#xff0c;结构化数据持久存…

网络通信之基础知识

一、什么是计算机网络&#xff1f;计算机网络是指由若干主机、通信链路和网络设备&#xff08;如路由器、交换机等&#xff09;组成的系统&#xff0c;借助通信协议&#xff0c;实现信息共享和资源互联。其本质是&#xff1a;多台设备之间通过协议进行数据交换。二、网络协议与…

Java 设计模式及应用场景

Java 设计模式是解决软件开发中常见问题的通用方案&#xff0c;通过合理的设计模式可以提高代码的可维护性、可扩展性和复用性。下面将介绍 Java 中常见的设计模式及其原理。一、设计模式的分类设计模式主要分为三大类&#xff0c;共 23 种经典模式&#xff1a;创建型模式&…

GitHub Jekyll博客本地Win开发环境搭建

GitHub Jekyll博客本地Win开发环境搭建 标签 后端 blog jekyll 全文链接 GitHub Jekyll博客本地Win开发环境搭建 概述 本文详细介绍了在Windows系统上搭建Jekyll博客本地开发环境的完整步骤&#xff0c;为GitHub Pages博客开发提供本地预览和调试能力。 环境依赖 Ruby环…

浏览器防录屏是怎样提高视频安全性?

文章目录前言一、什么是浏览器防录屏二、浏览器防录屏的原理是什么&#xff1f;&#xff08;javascript&#xff09;三、如何实现浏览器防录屏总结前言 在数字内容版权保护面临严峻挑战的今天&#xff0c;浏览器防录屏技术作为视频安全体系的关键一环&#xff0c;其重要性日益…

uni-app项目配置通用链接拉起ios应用android应用

uniapp开发ios&android可拉起app的辛酸历程IOS配置指南1、登录[apple Developer](https://developer.apple.com/account/resources/identifiers/list)账户找到自己开发的对应的项目2、确保对应项目的Associated Domains是打开状态3、本地创建一个 apple-app-site-associati…

deep learning(李宏毅)--(六)--loss

一&#xff0c;关于分类问题及其损失函数的一些讨论。 在构建分类模型是&#xff0c;我们的最后一层往往是softmax函数&#xff08;起到归一化的作用&#xff09;&#xff0c;如果是二分类问题也可以用sigmoid函数。 在loss函数的选择上&#xff0c;一般采用交叉熵损失函数(…

Python绑定及其在Mujoco仿真器中的作用

好的&#xff0c;这是一个非常核心且重要的问题。我来分两部分为你详细解释&#xff1a;首先是“什么是Python绑定”&#xff0c;然后是“它在MuJoCo中具体的作用”。第一部分&#xff1a;什么是Python绑定 (Python Binding)&#xff1f; 简单来说&#xff0c;Python绑定是一座…

数学建模从入门到国奖——备赛规划优秀论文学习方法

数学建模从入门到国奖——备赛规划 数学建模国一&#xff1a;我的逆袭经验分享在大二&#xff0c;我们团队初次参加妈妈杯&#xff0c;遗憾未获奖&#xff0c;后来经过5个月的时间&#xff0c;在大三上学期的9月&#xff0c;我们团队以C题数据挖掘机器学习创新斩获国赛一等奖&a…

大型语言模型的白日梦循环

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Gaussian Haircut论文】在Deepseek和Chatgpt的帮助下慢速了解核心方法

3.Method 一、 1.核心目标 输入&#xff1a;多张从不同角度拍摄的头发照片。输出&#xff1a;3D发型模型&#xff0c;且模型由发丝构成&#xff08;即每根头发被建模为独立的曲线/线段&#xff0c;而非体积/网络&#xff09;。 2.数据预处理 在正式重建前&#xff0c;需要从输入…

众趣SDK重磅升级:空间物联IOT新视界,赋能实景三维场景深度应用

近日&#xff0c;空间数字孪生云服务行业领导者—众趣科技宣布旗下核心产品云服务平台Qverse SDK迎来里程碑式升级&#xff01;本次升级聚焦行业前沿需求&#xff0c;重磅推出IoT设备监控系统、iframe跨平台页面无缝集成、BI数据智能三大解决方案&#xff0c;旨在将三维空间计算…

021_自然语言处理应用

自然语言处理应用 目录 NLP应用概述文本理解技术文本生成应用语言分析工具多语言处理专业领域应用实践案例 NLP应用概述 核心能力范围 文本理解 语义理解&#xff1a;深度理解文本含义和上下文实体识别&#xff1a;识别人名、地名、机构名等命名实体关系提取&#xff1a;…

小程序中状态管理Redux

Redux 是一个 集中式 状态管理框架&#xff0c;所有状态存储在一个 全局 Store 中&#xff0c;并通过 Action 触发 Reducer 进行数据更新。。1.安装npm install redux miniprogram-computed2.创建// store.js import { createStore } from "redux";// 定义初始状态 c…

c++:类型转换函数

简介 在C++中,类型转换运算符(也称为类型转换函数或转换函数)是一种特殊的成员函数,它允许将一个类类型的对象转换为其他类型。转换运算符的声明形式如下: operator type() const; 关键点 ​​声明​​:在类内部声明,没有返回类型(因为type已经表示了返回类型),没…