Django REST Framework (DRF) 视图类详解

DRF 提供了丰富的视图类来构建 API,从基础到高级,满足不同复杂度的需求。以下是 DRF 的主要视图类及其使用场景:

1. 基础视图类

APIView

所有 DRF 视图的基类,相当于 Django 的 View 类的增强版。

from rest_framework.views import APIView
from rest_framework.response import Responseclass ArticleAPIView(APIView):def get(self, request):articles = Article.objects.all()serializer = ArticleSerializer(articles, many=True)return Response(serializer.data)def post(self, request):serializer = ArticleSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=201)return Response(serializer.errors, status=400)

特点:

  • 提供了 Django View 的所有功能

  • 增加了 DRF 的请求/响应处理

  • 内置了认证、权限、限流等机制

2. 通用视图类 (Generic Views)

GenericAPIView

扩展了 APIView,增加了常见的列表和详情视图行为。

from rest_framework.generics import GenericAPIViewclass ArticleList(GenericAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializerdef get(self, request):queryset = self.get_queryset()serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

具体通用视图

DRF 提供了5个具体的通用视图类:

  1. ListAPIView - 只读列表

    from rest_framework.generics import ListAPIViewclass ArticleList(ListAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer

  2. RetrieveAPIView - 只读单个实例

    from rest_framework.generics import RetrieveAPIViewclass ArticleDetail(RetrieveAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer

  3. CreateAPIView - 只创建

    from rest_framework.generics import CreateAPIViewclass ArticleCreate(CreateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer

  4. UpdateAPIView - 只更新

    from rest_framework.generics import UpdateAPIViewclass ArticleUpdate(UpdateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer

  5. DestroyAPIView - 只删除

    from rest_framework.generics import DestroyAPIViewclass ArticleDelete(DestroyAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer

组合通用视图

  1. ListCreateAPIView - 列表 + 创建

    from rest_framework.generics import ListCreateAPIViewclass ArticleListCreate(ListCreateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer
  2. RetrieveUpdateAPIView - 详情 + 更新

    from rest_framework.generics import RetrieveUpdateAPIViewclass ArticleRetrieveUpdate(RetrieveUpdateAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer
  3. RetrieveDestroyAPIView - 详情 + 删除

    from rest_framework.generics import RetrieveDestroyAPIViewclass ArticleRetrieveDestroy(RetrieveDestroyAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer
  4. RetrieveUpdateDestroyAPIView - 详情 + 更新 + 删除

    from rest_framework.generics import RetrieveUpdateDestroyAPIViewclass ArticleRUD(RetrieveUpdateDestroyAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializer

3. 视图集 (ViewSets)

ViewSet

将多个视图逻辑组合到一个类中。

from rest_framework.viewsets import ViewSetclass ArticleViewSet(ViewSet):def list(self, request):queryset = Article.objects.all()serializer = ArticleSerializer(queryset, many=True)return Response(serializer.data)def retrieve(self, request, pk=None):article = get_object_or_404(Article, pk=pk)serializer = ArticleSerializer(article)return Response(serializer.data)

GenericViewSet

结合了 GenericAPIView 和 ViewSet 的行为。

from rest_framework.viewsets import GenericViewSetclass ArticleViewSet(GenericViewSet):queryset = Article.objects.all()serializer_class = ArticleSerializerdef list(self, request):queryset = self.get_queryset()serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

ModelViewSet

提供完整的 CRUD 操作。

from rest_framework.viewsets import ModelViewSetclass ArticleViewSet(ModelViewSet):queryset = Article.objects.all()serializer_class = ArticleSerializer# 自动获得 list, create, retrieve, update, destroy 方法

ReadOnlyModelViewSet

只提供只读操作。

from rest_framework.viewsets import ReadOnlyModelViewSetclass ArticleViewSet(ReadOnlyModelViewSet):queryset = Article.objects.all()serializer_class = ArticleSerializer# 自动获得 list 和 retrieve 方法

4. 自定义动作

可以在 ViewSet 中添加自定义路由和方法:

from rest_framework.decorators import action
from rest_framework.response import Responseclass ArticleViewSet(ModelViewSet):queryset = Article.objects.all()serializer_class = ArticleSerializer@action(detail=True, methods=['post'])def publish(self, request, pk=None):article = self.get_object()article.published = Truearticle.save()return Response({'status': 'published'})@action(detail=False)def recent(self, request):recent_articles = Article.objects.order_by('-created_at')[:5]serializer = self.get_serializer(recent_articles, many=True)return Response(serializer.data)

5. 其他特殊视图

mixins

可以组合使用的混合类:

  1. ListModelMixin - 提供列表功能

  2. CreateModelMixin - 提供创建功能

  3. RetrieveModelMixin - 提供详情功能

  4. UpdateModelMixin - 提供更新功能

  5. DestroyModelMixin - 提供删除功能

from rest_framework import mixins
from rest_framework.viewsets import GenericViewSetclass ArticleViewSet(mixins.ListModelMixin,mixins.CreateModelMixin,GenericViewSet):queryset = Article.objects.all()serializer_class = ArticleSerializer

视图选择指南

  1. 简单API:使用 APIView 或 GenericAPIView

  2. 标准CRUD:使用通用视图 (ListCreateAPIView 等) 或 ModelViewSet

  3. 只读API:使用 ReadOnlyModelViewSet

  4. 需要自定义行为:使用 ViewSet 或 GenericViewSet 配合 mixins

  5. 复杂逻辑:从 APIView 继承并自行实现

路由配置示例

# 对于 ViewSet
from rest_framework.routers import DefaultRouterrouter = DefaultRouter()
router.register(r'articles', ArticleViewSet)urlpatterns = [path('', include(router.urls)),
]# 对于通用视图
urlpatterns = [path('articles/', ArticleList.as_view()),path('articles/<int:pk>/', ArticleDetail.as_view()),
]

DRF 的视图系统非常灵活,可以根据项目需求选择合适的视图类,从简单到复杂都能很好地支持。

应用示例

创建一个django项目

创建 Django 项目
django-admin startproject test_restcd test_rest
创建应用
python manage.py startapp myapp

 下载

pip install djangorestframework

django项目注释掉一些不需要的,然后注册rest_framework

注释INSTALLED_APPS,MIDDLEWARE,TEMPLATES里自带的一些内容

#settings.py"""
Django settings for test_rest project.Generated by 'django-admin startproject' using Django 5.2.5.For more information on this file, see
https://docs.djangoproject.com/en/5.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/5.2/ref/settings/
"""from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-!07)9y63bmcjs7__+me1a^sirkne20g1lz37bqrt&rt#%(5g1h'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = [# 'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes',# 'django.contrib.sessions',# 'django.contrib.messages','django.contrib.staticfiles',"rest_framework"
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',#'django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware',# 'django.contrib.auth.middleware.AuthenticationMiddleware',# 'django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]ROOT_URLCONF = 'test_rest.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.request',# 'django.contrib.auth.context_processors.auth',# 'django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'test_rest.wsgi.application'# Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}# Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/5.2/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.2/howto/static-files/STATIC_URL = 'static/'# Default primary key field type
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

Django REST Framework (DRF) 中的 FBV 与 CBV

FBV(Function-Based Views,函数基础视图)和 CBV(Class-Based Views,类基础视图)是 Django 和 Django REST Framework (DRF) 中实现视图逻辑的两种主要方式。

test_rest/urls.py"""
URL configuration for test_rest project.The `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/5.2/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.urls import path,include
from myapp import viewsurlpatterns = [path('auth/',views.auth), #FBVpath('myview/',views.MyView.as_view()),#CBVpath('info/',views.MyView.as_view()),#CBV]
/myapp/views.py
from django.http import JsonResponse
from django.views import View
from rest_framework.views import APIView
from rest_framework.response import Responsedef auth(request):if request.method == "GET":return JsonResponse({"status":True,'message':'success',"method":request.method})elif request.method == "POST":return JsonResponse({"status":True,'message':'success',"method":request.method})return JsonResponse({"status":False,"method":request.method})class MyView(View):def get(self,request):return JsonResponse({"status":True,'message':'success',"method":request.method})def post(self,request):return JsonResponse({"status":True,'message':'success',"method":request.method})def put(self,request):return JsonResponse({"status":True,'message':'success',"method":request.method})def delete(self,request):return JsonResponse({"status":True,'message':'success',"method":request.method})class InfoView(APIView):def get(self,request):return Response({"status":True,'message':'success',"method":request.method})

Django REST Framework (DRF) 视图类详解

DRF 提供了丰富的视图类来构建 API,从基础到高级,满足不同复杂度的需求。以下是 DRF 的主要视图类及其使用场景:

开始前咱们先创建一个数据库,模型类,然后迁移数据

 一、MySQL 数据库配置

1. 安装 MySQL 驱动
pip install mysqlclient  # 推荐
# 或
pip install pymysql
2. 创建 MySQL 数据库
CREATE DATABASE backstage CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 配置 Django 的 settings.py
# settings.py
DATABASES = {'default': {  # 默认数据库配置(Django 支持多数据库配置)'ENGINE': 'django.db.backends.mysql',  # 指定使用 MySQL 后端'NAME': 'backstage',                   # 数据库名(需提前创建)'USER': 'your_username',               # MySQL 用户名'PASSWORD': 'your_password',           # MySQL 密码'HOST': 'localhost',                   # 数据库服务器地址(默认本地)'PORT': '3306',                        # MySQL 默认端口'OPTIONS': {                           # 额外选项(关键配置)'charset': 'utf8mb4',              # 字符集设置为 utf8mb4'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",  # 初始化 SQL 命令}}
}

 二、创建商品模型

定义模型(myapp/models.py)
from django.db import models
from django.core.validators import MinValueValidatorclass SpecificationCategory(models.Model):"""规格类目表"""id = models.AutoField(primary_key=True, verbose_name="商品ID")name = models.CharField(max_length=50, verbose_name="规格类目名称")cid = models.CharField(max_length=50, verbose_name="类目编号")class Meta:db_table = 'spec_category'verbose_name = '商品规格类目'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass Product(models.Model):"""商品表"""id = models.AutoField(primary_key=True, verbose_name="商品ID")price = models.DecimalField(max_digits=10,decimal_places=2,validators=[MinValueValidator(0)],verbose_name="商品价格")stock = models.PositiveIntegerField(default=0, verbose_name="商品库存")# 一对多关联规格类目spec_category = models.ForeignKey(SpecificationCategory,on_delete=models.PROTECT,related_name='products',  # 注意改为复数形式verbose_name="规格类目")image = models.CharField(max_length=500,blank=True,null=True,verbose_name="商品主图URL")selling_points = models.CharField(max_length=200,blank=True,verbose_name="商品卖点")description = models.TextField(verbose_name="商品详情描述")# 自动记录时间created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")class Meta:db_table = 'product'verbose_name = '商品信息'verbose_name_plural = verbose_nameordering = ['-created_at']def __str__(self):return f"商品{self.id}(库存:{self.stock})"

 三、数据库迁移

注意要在settings.py里注册app哦

1. 生成迁移文件
python manage.py makemigrations myapp
2. 查看生成的SQL(可选)
python manage.py sqlmigrate myapp 0001
3. 执行迁移
python manage.py migrate

示例

 1. 首先创建序列化器

在 serializers.py 中:

from rest_framework import serializers
from .models import Product, SpecificationCategoryclass SpecificationCategorySerializer(serializers.ModelSerializer):class Meta:model = SpecificationCategoryfields = ['id', 'name', 'cid']class ProductSerializer(serializers.ModelSerializer):# 保留只读的嵌套表示spec_category = SpecificationCategorySerializer(read_only=True)# 改为只接受spec_category的IDspec_category_id = serializers.PrimaryKeyRelatedField(queryset=SpecificationCategory.objects.all(),source='spec_category',write_only=True)class Meta:model = Productfields = ['id', 'price', 'stock', 'spec_category','image', 'selling_points', 'description','created_at', 'updated_at']read_only_fields = ['created_at', 'updated_at']

APIView 使用示例

2. 创建 APIView 视图

在 views.py 中:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Product
from .serializers import ProductSerializer
from django.shortcuts import get_object_or_404class ProductAPIView(APIView):"""商品API视图,支持列表获取和创建"""def get(self, request, format=None):"""获取所有商品列表"""products = Product.objects.all()serializer = ProductSerializer(products, many=True)return Response(serializer.data)def post(self, request, format=None):"""创建新商品"""serializer = ProductSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)class ProductDetailAPIView(APIView):"""商品详情API视图,支持检索、更新和删除单个商品"""def get_object(self, pk):return get_object_or_404(Product, pk=pk)def get(self, request, pk, format=None):"""获取单个商品详情"""product = self.get_object(pk)serializer = ProductSerializer(product)return Response(serializer.data)def put(self, request, pk, format=None):"""更新整个商品信息"""product = self.get_object(pk)serializer = ProductSerializer(product, data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)def patch(self, request, pk, format=None):"""部分更新商品信息"""product = self.get_object(pk)serializer = ProductSerializer(product, data=request.data, partial=True)if serializer.is_valid():serializer.save()return Response(serializer.data)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)def delete(self, request, pk, format=None):"""删除商品"""product = self.get_object(pk)product.delete()return Response(status=status.HTTP_204_NO_CONTENT)
3. 配置 URL 路由

在 urls.py 中:

from django.urls import path
from myapp.views import ProductAPIView,ProductDetailAPIViewurlpatterns = [path('products/', ProductAPIView.as_view(), name='product-list'),path('products/<int:pk>/', ProductDetailAPIView.as_view(), name='product-detail'),
]

访问:

ViewSets的ModelViewSet示例

 2. 创建 APIView 视图

在 views.py 中:

from .models import Product,SpecificationCategory
from .serializers import ProductSerializer,SpecificationCategorySerializer
from rest_framework import viewsetsclass SpecificationCategoryViewSet(viewsets.ModelViewSet):queryset = SpecificationCategory.objects.all()serializer_class = SpecificationCategorySerializerclass ProductViewSet(viewsets.ModelViewSet):queryset = Product.objects.all()serializer_class = ProductSerializer
3. 配置 URL 路由

在 urls.py 中:

from django.urls import path, include
from myapp.views import *
from rest_framework.routers import DefaultRouterrouter = DefaultRouter()
router.register('spec-categories', SpecificationCategoryViewSet)
router.register('products_view', ProductViewSet)
urlpatterns = [path('api/', include(router.urls)),  # 注意这里包含了路由
]

访问:

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

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

相关文章

Linux面试题及详细答案 120道(1-15)-- 基础概念

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

week1-[分支结构]中位数

week1-[分支结构]中位数 题目描述 给定 444 个正整数 a,b,c,da,b,c,da,b,c,d&#xff0c;输出它们的中位数&#xff0c;答案四舍五入保留 111 位小数。 输入格式 输入共 111 行 444 个正整数 a,b,c,da,b,c,da,b,c,d。 输出格式 输出共 111 行 111 个浮点数表示答案。 样例 #1 样…

[激光原理与应用-259]:理论 - 几何光学 - 平面镜的反射、平面透镜的折射、平面镜的反射成像、平面透镜的成像的规律

一、平面镜的反射规律平面镜的反射遵循镜面反射定律&#xff0c;即光线在光滑表面&#xff08;反射面平整度远大于波长&#xff09;发生反射时&#xff0c;满足以下条件&#xff1a;反射光线、入射光线与法线共面&#xff1a;反射光线、入射光线和法线&#xff08;垂直于反射面…

相机按键功能解析

相机按键功能解析佳能相机按键机身背面机身正面机身顶部机身侧面 佳能相机按键 机身背面取景器目镜&#xff1a;用于拍摄时观察相机形成的图像。实拍显示/视频拍摄按钮&#xff1a;按下即可开始拍摄或录制视频。光圈/曝光补偿键&#xff1a;调整光圈大小和曝光补偿&#xff0c;…

51单片机-驱动LED模块教程

本章思维导图&#xff1a; 51单片机驱动LED灯模块 LED灯元器件简介 LED&#xff08;Light Emitting Diode&#xff0c;发光二极管&#xff09; 是一种固态半导体器件&#xff0c;通过P-N结中电子与空穴复合直接将电能转化为光能。其核心结构由P型半导体&#xff08;空穴主导&a…

Git 完全手册:从入门到团队协作实战(2)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

c语言中堆和栈的区别

1.栈区(stack):由编译器自动分配释放&#xff0c;栈主要用于存储局部变量、函数参数、函数调用和返回信息等。其操作方式类似于数据结构中的栈。 2.堆区(heap):一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;则可能会引起内存泄漏。注堆和数据结构中的堆栈不一样…

华为实验WLAN 基础配置随练

业务vlan 20 192.168.20.x管理vlan 100 192.168.100.x步骤① 网络互通Core sw:vlan batch 20 100 dhcp enable int vlanif 20IP add 192.168.20.1 24dhcp select interfaceinterface GigabitEthernet0/0/1/2port link-type trunkport trunk pvid vlan 100port trunk allow-pas…

CMake 如何查找 Python2和Python3

问题 在一个CMakeLists.txt文件里面看到了下面的这句话 find_package(Python2 COMPONENTS Interpreter Development NumPy)这个好有趣啊&#xff0c;Python2也是一个C的库吗&#xff0c;也有Python2Config.cmake或者FindPython2.cmake? 回答 find_package(Python2 COMPONENTS …

心灵笔记:刻意练习

心灵笔记&#xff1a;刻意练习提要 所有人都以为“杰出”源于“天赋”&#xff0c;而“天才”却说&#xff1a;我的成就源于“正确的练习”&#xff01; 定义&#xff1a;刻意练习是一种有目的、有方法、能带来能力持续提升的结构化训练方式&#xff0c;它并非简单的重复劳动&a…

langchain入门笔记03:使用fastapi部署本地大模型后端接口,优化局域网内的问答响应速度

文章目录前言一、fastapi的简单入门1&#xff1a;安装必要的包&#xff08;python3.11&#xff09;&#xff1a;2&#xff1a;快速搭建一个fastapi&#xff1a;二、提升问答的响应速度1. fastapi部署后端接口&#xff0c;在局域网内访问的方法2. 局域网内的测试&#xff1a;“未…

【CDA 新一级】学习笔记第1篇:数据分析的时代背景

作者&#xff1a;CDA持证人 张九领我们要学习数据分析&#xff0c;就要从当前时代的数据特点&#xff0c;找到在时代特点下企业需要数据分析的痛点&#xff0c;然后理解数据分析在企业中的作用。当前时代&#xff0c;数据分析的特征是哪些呢&#xff1f;我们用VUCA来概括数据分…

Vite 为什么比 Webpack 快?原理深度分析

Hi&#xff0c;我是布兰妮甜 &#xff01;在现代前端开发中&#xff0c;构建工具的性能直接影响开发体验和生产力。Webpack 作为传统打包工具的代表&#xff0c;长期以来主导着前端构建领域&#xff0c;而 Vite 作为新一代的前端构建工具&#xff0c;凭借其出色的开发服务器启动…

数字电路上的通讯速度是越快越好还是越慢越好?

昨天我突发奇想&#xff0c;修改了一下MCU和INA226以及DAC8551的通讯速率。之前的INA226用的是I2C通讯&#xff0c;之前设置的速率是100Kbps&#xff0c;DAC8551是SPI通讯&#xff0c;速率是10Mbps&#xff0c;昨天修改之前输出位置的测试结果如图&#xff1a;可以看到&#xf…

Google Gemini 的深度研究终于进入 API 阶段

Google Gemini 最强大的功能之一是深度研究&#xff0c;但到目前为止&#xff0c;它一直严格限制在 Gemini 界面上。这种情况可能很快就会改变。 通过 Gemini 中的深度研究&#xff0c;您可以搜索几乎任何内容&#xff0c;包括学者、现有研究论文等。 谷歌将深度研究描述为一…

通过beeware制作安卓apk用于获取cpolar网址

我们都知道&#xff0c;没有付费的cpolar用户&#xff0c;要不时更新cpolar网址。每次都要自己登录去获取远程的cpolar个人网址比较麻烦&#xff0c;好在可以用python去自动获取。这里说的是&#xff0c;比如用手机装termux软件&#xff0c;再在termux中装cpolar&#xff0c;然…

Swift 实战:用链表和哈希表写出高性能的贪吃蛇引擎(LeetCode 353)

文章目录摘要描述解决方案解析问题与解决方案关键细节逐条讲示例与运行结果时间复杂度空间复杂度总结摘要 这题的目标是设计一个“贪吃蛇”核心引擎&#xff1a;给定棋盘大小和一串食物位置&#xff0c;支持不断调用 move(direction) 推进游戏&#xff0c;返回当前分数&#x…

2025-08-15:按对角线进行矩阵排序。用go语言,给你一个 n × n 的整数矩阵,要求返回一个按下面规则调整后的矩阵: - 将每一条与主对角线平行的斜线视为一个序列。对于位于主对角线及其下方的

2025-08-15&#xff1a;按对角线进行矩阵排序。用go语言&#xff0c;给你一个 n n 的整数矩阵&#xff0c;要求返回一个按下面规则调整后的矩阵&#xff1a;将每一条与主对角线平行的斜线视为一个序列。对于位于主对角线及其下方的那些斜线&#xff08;即所在位置的行索引 ≥ …

MySQL相关概念和易错知识点(5)(索引、事务、MVCC)

目录1.索引&#xff08;1&#xff09;局部性原理a.局部性原理在计算机中的地位b.pagec.池化技术&#xff08;Buffer Pool&#xff09;&#xff08;2&#xff09;如何理解索引&#xff08;3&#xff09;索引的原理a.page的构成b.多层目录c.基于B树的索引①B树的特性在索引中的作…

SQLite 子查询

SQLite 子查询 SQLite 是一个轻量级的数据库管理系统&#xff0c;广泛应用于移动设备、嵌入式系统和桌面应用。在处理复杂的查询时&#xff0c;子查询&#xff08;Subquery&#xff09;是SQLite数据库查询语言中的一个强大工具。本文将详细介绍SQLite子查询的概念、用法及其在数…