掌握1对1与1对多数据库关系
1.1对1何为1对1 2个表互相对照对方 没有其他的表 在生活中常见的1对1关系有作者和作者信息 一个作者只有一个信息 这个信息只能是这个作者作者 李白信息 朝代、年龄、笔名如果将作者删除那么 信息也会跟着一起删除 两个表是关联的关系然后是操作1.查所有的作者 作者下带着资料book_router.get(/page/size) async def select_book_page_size(page:int1,size:int5): offset(page-1)*size bookawait Book.all().prefetch_related(category).offset(offset).limit(size) book_list [ { id: b.id, name: b.name, price: b.price, number: b.number, category: { id: b.category.id, name: b.category.name, text: b.category.text } } for b in book ] total len(book_list) return {message: 查询成功,total:total,data:book_list}包含分页offset(page-1)*size 是分页必写的内容bookawait Book.all().prefetch_related(category).offset(offset).limit(size)Book.all(). 查找book下的所有内容 prefetch_related(category) 连接到category表.offset(offset).limit(size) 进行分页book_list [] 新建一个表 表中是我们要展示的所有内容 首先是我们的内容id: b.id,name: b.name,price: b.price,number: b.number,外键内容category: {id: b.category.id,name: b.category.name,text: b.category.text}用for b in book 来循环 b是book里面的每条消息category中 b.category.id, b下分类下的id就也把另一个表的内容也输出了1对1的表 查询一个表另一个表的数据也要输出2.删除1个表另一个也跟着删除book_router.delete(/delete_book/{id}) async def delete_book(id:int): bookawait Book.filter(idid).prefetch_related(category).first() if not book: return {message: 图书不存在} await book.category.delete() await book.delete() return {message: 删除成功}先查到要删除的信息 然后prefetch_related(category) 连接到另一个表await book.category.delete()await book.delete()直接删除 从book连接到category 删除两个表中的数据2.1对多1.查询一个表下所有的数据day02_book_router.get(/) async def get_book_list(page:int1,page_size:int10,keyword:strNone): queryArticle.all() if keyword: query query.filter(Q(title__icontainskeyword) | Q(content__icontainskeyword)) total await query.count() offset (page-1)*page_size articles await query.prefetch_related(category, author, tags).offset(offset).limit(page_size) articles_list[ { id:article.id, title:article.title, summary:article.summary, content:article.content, category:{ id:article.category.id, name:article.category.name, description:article.category.description, }, author:article.author.username, view_count:article.view_count, status:article.status, tags:[tag.name for tag in article.tags], } for article in articles ] return {code:200,message:获取成功,total: total,data:articles_list}查询当前商品下的信息 包含标签表tags:[tag.name for tag in article.tags]tag 在article.tags 代表每条消息 然后只取name 赋值给tagetags下有多个信息 然后类别也跟着输出还可以传page size-page 进行分页 也可以传keyword 进行模糊查询一个book下的详细信息以及标签就是1对多的查询2.post添加day02_book_router.post(/) async def create_article(article_data: ArticleCreateRequest): data article_data.dict() tag_id_list data.pop(tags) category_id data.pop(category_id) author_id data.pop(author_id) category await Category.get(idcategory_id) author await User.get(idauthor_id) if not all([category, author]): return {code: 400, message: 分类或作者不存在} article await Article.create( titledata[title], contentdata[content], summarydata[summary], statusdata[status], categorycategory, authorauthor ) if tag_id_list: tag_objs await Tag.filter(id__intag_id_list) await article.tags.add(*tag_objs) return {code: 200, message: 创建成功, data: article.id}先新建一个请求体ArticleCreateReques 里面的字段和models的字端相等data article_data.dict() 转化为字典 赋值给data 我们要将外键取出来判断再加到表中tag_id_list data.pop(tags) category_id data.pop(category_id) author_id data.pop(author_id) category await Category.get(idcategory_id) author await User.get(idauthor_id) if not all([category, author]): return {code 400message分类或作者不存在}将标签 类 作者从data.pop取出来赋值 然后在类表和作者表中查找是否存在 如果存在的话我们就加到article的外键字段中if tag_id_list: tag_objs await Tag.filter(id_intag_id_list) await article.tags.add(*tag_objs)判断 我们的标签 是否是我们标签表中的内容 如果是我们add加到我们的article中如果我们传的类 作者 标签 不在我们对应的表中 我们都会显示错误3.查询当前类下有什么书day02_category_router.get(/) async def get_category_list(): categories await Category.all().prefetch_related(articles) categories_list[ { id:category.id, name:category.name, description:category.description, articles_count:len(category.articles), articles:[ { id:article.id, title:article.title, summary:article.summary, content:article.content, # author:article.author.username, view_count:article.view_count, status:article.status, # tags:[tag.name for tag in article.tags], } for article in category.articles ] } for category in categories ] return {code:200,message:获取成功,data:categories_list}categories await Category.all()-prefetch_related(articles) 查询类的所有内容连接 articles外键定义一个表categories_list 并把我们类要展示的内容写出来每个类有什么图书 就是类中包含一个字段是图书 articles定义一个类 articles {id:article.id,title:article.title,summary :article.summary,content:article.content,# author:article.author.username,view_count:article.view_count,status:article.status,# tags:[tag.name for tag in article.tags],}其中author和tags没有连接他们的表所以显示不出来for article in category.articlescategory.articles 类到图书表 每条赋值给articles 然后在articles 字段中以此输出类id1 下有有图书 68等多条消息都可以在下显示出来

相关新闻

不同系统下设置静态IP

不同系统下设置静态IP

虽然所有 Linux 系统在底层的内核操作是相同的(临时配置都可以用 ip 或 ifconfig),但让静态 IP 永久生效的配置文件格式、路径以及后台网络管理服务,在不同操作系统中截然不同。各大常见系统设置静态 IP 的机制对比与操作示例说明…

2026/10/20 12:57:23 阅读更多 →
3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案

3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案

3分钟掌握Chrome滚动截图神器:一键保存完整网页的终极方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-e…

2026/10/19 23:06:58 阅读更多 →
�鸿蒙报错速查:arkts-limited-stdlib __proto__ 原型链访问,用了就炸,根因 + 真解法

�鸿蒙报错速查:arkts-limited-stdlib __proto__ 原型链访问,用了就炸,根因 + 真解法

报错原文 ERROR: 10505001 ArkTS Compiler Error Error Message: Property __proto__ does not exist on type Object. At File: xxx.ets:N:N常伴生报错: Error Message: Usage of standard library is restricted (arkts-limited-stdlib)报错触发场景 你写鸿蒙 Ark…

2026/10/17 14:50:58 阅读更多 →

最新新闻

SecureCRT免安装版配置指南:离线串口调试与SSH便携部署

SecureCRT免安装版配置指南:离线串口调试与SSH便携部署

简介:本资源为SecureCRT绿色便携版免安装包,面向系统管理员、运维工程师及开发人员,解决多平台快速部署安全终端连接工具的需求,尤其适用于需在不同电脑间频繁切换、无管理员权限或追求轻量使用的场景。压缩包共137个文件&#xf…

2026/10/20 14:00:00 阅读更多 →
防火墙规则集时序配置:顺序、生效时间与安全空窗排查

防火墙规则集时序配置:顺序、生效时间与安全空窗排查

防火墙规则集里的时序配置,是我这几年排查安全事件时最常踩的隐形坑。规则明明写对了,但因为顺序放错、时间对象失效、批量下发存在中间态,导致规则的实际生效时间和预期完全对不上,轻则策略空转半个月没人发现,重则直…

2026/10/20 14:00:00 阅读更多 →
Python Pygame核心机制与实战:从零构建接苹果小游戏

Python Pygame核心机制与实战:从零构建接苹果小游戏

很多人在命令行里写过一阵Python脚本之后,总想搞点“能动的、看得见的东西”。Python Pygame模块就是你会碰到的第一块敲门砖:一个基于SDL封装、专门用来做2D图形和游戏的原生库。我第一次用它做窗口程序的时候,印象最深的不是那种“我能控制…

2026/10/20 14:00:00 阅读更多 →
100套可配置ECharts大数据大屏模板工程包

100套可配置ECharts大数据大屏模板工程包

简介:本资源是一套面向数据可视化工程师、前端开发人员及政企数字化项目实施者的专业级大屏模板集合,覆盖社区治理、智慧物业、数字政务、智能交通、金融银行等十余个高需求行业场景,有效解决业务数据实时监控与决策看板快速搭建难题。压缩包…

2026/10/20 14:00:00 阅读更多 →
AI加速剪辑工作流:字幕、粗剪与卡点自动化实战

AI加速剪辑工作流:字幕、粗剪与卡点自动化实战

我见过太多人剪视频,剪到怀疑人生。明明素材拍得挺好,脚本也没什么大问题,但就是一剪一整夜,导出前还在逐帧删吸气声、给字幕换行、把片尾黑场拖到精确位置。你以为是效率问题,其实是你把80%的时间花在了AI 10秒就能搞…

2026/10/20 14:00:00 阅读更多 →
深度学习训练调参实战:梯度、激活函数、学习率与优化器的链路

深度学习训练调参实战:梯度、激活函数、学习率与优化器的链路

入门深度学习时,很多人会被一连串名词劝退:激活函数、优化器、学习率、梯度。我第一次跑模型的时候也觉得它们是四个独立的调参项,今天调一下学习率,明天换一个激活函数,最后模型loss曲线像心电图一样乱跳,…

2026/10/20 13:59:00 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →