当前位置: 首页 > news >正文

Django多对多ManyToManyField字段

Django是一个支持多对多关系的Web框架,可以在模型中定义多对多关系。多对多关系通常涉及两个实体之间的复杂交互,例如用户和组之间的关系,或者课程和学生之间的关系。在Django中,可以使用ManyToManyField字段来定义多对多关系。

例如,我们可以定义一个名为Student的模型和一个名为Course的模型,并在它们之间建立多对多关系,如下所示:

class Student(models.Model):name = models.CharField(max_length=50)courses = models.ManyToManyField(Course)class Course(models.Model):name = models.CharField(max_length=50)students = models.ManyToManyField(Student)

在上面的代码中,Student模型中的courses和Course模型中的students都是ManyToManyField字段,这意味着一个学生可以选择多个课程,而一个课程也可以拥有多个学生。

要在代码中创建多对多关系,可以使用add()、remove()、clear()和set()等方法进行操作。例如,可以使用以下代码将一个学生添加到一个课程中:

course = Course.objects.get(id=1)
student = Student.objects.get(id=1)
course.students.add(student)

上面的代码将学生添加到课程中,并创建一个关联记录,将学生和课程关联起来。可以使用类似的方法将一个学生从一个课程中删除:

course = Course.objects.get(id=1)
student = Student.objects.get(id=1)
course.students.remove(student)

此外,还可以使用额外的关联数据来存储有关关系的附加信息。例如,可以使用以下代码将一个学生与一个课程关联,并存储学生在该课程中的分数:

course = Course.objects.get(id=1)
student = Student.objects.get(id=1)
course.students.add(student, through_defaults={'score': 90})

上面的代码将学生与课程关联,并将分数存储在额外的关联数据中。要访问附加关联数据,可以使用through模型,例如:

class Enrollment(models.Model):student = models.ForeignKey(Student, on_delete=models.CASCADE)course = models.ForeignKey(Course, on_delete=models.CASCADE)score = models.IntegerField()class Student(models.Model):name = models.CharField(max_length=50)courses = models.ManyToManyField(Course, through=Enrollment)class Course(models.Model):name = models.CharField(max_length=50)students = models.ManyToManyField(Student, through=Enrollment)

在上面的代码中,我们定义了一个名为Enrollment的模型,它保存学生与课程之间的关联数据,例如学生在该课程中的分数。然后,我们将Enrollment模型传递给ManyToManyField字段的through参数,以便在创建关联记录时将关联数据存储在Enrollment模型中。现在,我们可以使用以下代码访问学生在一个课程中的分数:

enrollment = Enrollment.objects.filter(student=student, course=course).first()
score = enrollment.score

使用prefetch_related()函数进行查询,减少查询的次数。
它是Django ORM提供的用于表关联查询时减少查询次数的一个函数。当我们查询一个Model时,如果和其他Model有外键或多对多关系,那么默认情况下,Django ORM会分别查询这些关联的Model,这样很容易出现查询次数过多的问题。prefetch_related()的作用是把需要查询的关联Model都一次性查询出来,可以有效减少查询次数,提高性能。
使用方法:使用prefetch_related()函数需要满足以下条件:当前Model必须有关联的其他Model必须有外键或多对多关系
下面是使用prefetch_related()函数的用法:
Student.objects.prefetch_related(‘enrollment__score’, …).values(‘enrollment__score’)
需要注意的是,prefetch_related()函数只能对关联的外键或多对多关系进行查询,不能对一对一关系进行查询。

相关文章:

Django多对多ManyToManyField字段

Django是一个支持多对多关系的Web框架,可以在模型中定义多对多关系。多对多关系通常涉及两个实体之间的复杂交互,例如用户和组之间的关系,或者课程和学生之间的关系。在Django中,可以使用ManyToManyField字段来定义多对多关系。 …...

docker-centos中基于keepalived+niginx模拟主从热备完整过程

文章目录 一、环境准备二、主机1、环境搭建1.1 镜像拉取1.2 创建网桥1.3 启动容器1.4 配置镜像源1.5 下载工具包1.6 下载keepalived1.7 下载nginx 2、配置2.1 配置keepalived2.2 配置nginx2.2.1 查看nginx.conf2.2.2 修改index.html 3、启动3.1 启动nginx3.2 启动keepalived 4、…...

软件科技成果鉴定测试需提供哪些材料?

为了有效评估科技成果的质量,促进科技理论向实际应用转化,所以需要进行科技成果鉴定测试。申请鉴定的科技成果范围是指列入国家和省、自治区、直辖市以及国务院有关部门科技计划内的应用技术成果,以及少数科技计划外的重大应用技术成果。   …...

办公word-从不是第一页添加页码

总结 实际需要注意的是,分隔符、分节符和分页符并不是一个含义 分隔符包含其他两个;分页符:是增加一页;分节符:指将文档分为几部分。 从不是第一页插入页码1步骤 1,插入默认页码 自己可以测试时通过**…...

Android笔记(十七):PendingIntent简介

PendingIntent翻译成中文为“待定意图”,这个翻译很好地表示了它的涵义。PendingIntent描述了封装Intent意图以及该意图要执行的目标操作。PendingIntent封装Intent的目标行为的执行是必须满足一定条件,只有条件满足,才会触发意图的目标操作。…...

为 Compose MultiPlatform 添加 C/C++ 支持(2):在 jvm 平台使用 jni 实现桌面端与 C/C++ 互操作

前言 在上篇文章中我们已经介绍了实现 Compose MultiPlatform 对 C/C 互操作的基本思路。 并且先介绍了在 kotlin native 平台使用 cinterop 实现与 C/C 的互操作。 今天这篇文章将补充在 jvm 平台使用 jni。 在 Compose MultiPlatform 中,使用 jvm 平台的是 An…...

【PyTorch】卷积神经网络

文章目录 1. 理论介绍1.1. 从全连接层到卷积层1.1.1. 背景1.1.2. 从全连接层推导出卷积层 1.2. 卷积层1.2.1. 图像卷积1.2.2. 填充和步幅1.2.3. 多通道 1.3. 池化层(又称汇聚层)1.3.1. 背景1.3.2. 池化运算1.3.3. 填充和步幅1.3.4. 多通道 1.4. 卷积神经…...

qt可以详细写的项目或技术

1.QT 图形视图框架 2.QT 模型视图结构 3.QT列表显示大量信息 4.QT播放器 5.QT 编解码 6.QT opencv...

操作系统笔记——储存系统、文件系统(王道408)

文章目录 前言储存系统地址转换内存扩展覆盖交换 储存器分配——连续分配固定大小分区动态分区分配动态分区分配算法 储存器分配——非连续分配页式管理基本思想地址变换硬件快表(TLB)多级页表 段式管理段页式管理 虚拟储存器——基于交换的内存扩充技术…...

基于Html+腾讯云播SDK开发的m3u8播放器

周末业余时间在家无事,学习了一下腾讯的云播放sdk,并制作了一个小demo(m3u8播放器),该在线工具是基于腾讯的云播sdk开发的,云播sdk非常牛,可以支持多种播放格式。 预览地址 m3u8player.org 源码…...

uniapp小程序分享为灰色

引用:https://www.cnblogs.com/panwudi/p/17074172.html uniapp开发的微信小程序,没有转发,分享: 创建一个mixin:common/share.js export default {onShareAppMessage(res) { //发送给朋友return {}},onShareTimeline(res) {//…...

python:五种算法(OOA、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、五种算法简介 1、鱼鹰优化算法OOA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、粒子群优化算法PSO 5、遗传算法GA 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…...

DIP——添加运动模糊与滤波

1.运动模糊 为了模拟图像退化的过程,在这里创建了一个用于模拟运动模糊的点扩散函数,具体模糊的方向取决于输入的motion_angle。如果运动方向接近水平,则模糊效果近似水平,如果运动方向接近垂直,则模糊效果近似垂直。具…...

SQL Server查询计划(Query Plan)——SQL处理过程

6. 查询计划(Query Plan) 6.1. SQL处理过程 就SQL语句的处理过程而言,各关系库间大同小异,尤其是商业库之间实现机制和细节差别更小些,其功能及性能支持方面也更加强大和完善。SQL Server作为商业库中的后起之秀,作为SQL语句处理过程的主要支撑和保障,其优化器及相关机…...

【动手学深度学习】(十二)现代卷积神经网络

文章目录 一、深度卷积神经网络AlexNet1.理论知识 一、深度卷积神经网络AlexNet 1.理论知识 ImageNet(2010) 图片自然物体的彩色图片手写数字的黑色图片大小468 * 38728*28样本数1.2M60K类数100010 AlexNet AlexNet赢了2012ImageNet竞赛更深更大的LeNet主要改进&#xff…...

【小沐学Python】Python实现TTS文本转语音(speech、pyttsx3、百度AI)

文章目录 1、简介2、Windows语音2.1 简介2.2 安装2.3 代码 3、pyttsx33.1 简介3.2 安装3.3 代码 4、ggts4.1 简介4.2 安装4.3 代码 5、SAPI6、SpeechLib7、百度AI8、百度飞桨结语 1、简介 TTS(Text To Speech) 译为从文本到语音,TTS是人工智能AI的一个模组&#xf…...

TCP通信

第二十一章 网络通信 本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 接下来会一一讲解 TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式,也有着优点和缺点…...

2023济南大学acm新生赛题解

通过答题情况的难度系数&#xff1a; 签到&#xff1a;ACI 铜牌题&#xff1a;BG 银牌题&#xff1a;EF 金牌题&#xff1a;DHJKO 赛中暂未有人通过&#xff1a;LMNP A - AB Problem 直接根据公式计算就行。 #include<stdio.h> int main(){int a,b;scanf("%…...

docker-compose安装教程

1.确认docker-compose是否安装 docker-compose -v如上图所示表示未安装&#xff0c;需要安装。 如上图所示表示已经安装&#xff0c;不需要再安装&#xff0c;如果觉得版本低想升级&#xff0c;也可以继续安装。 2.离线安装 下载docker-compose安装包&#xff0c;上传到服务…...

【rabbitMQ】rabbitMQ用户,虚拟机地址(添加,修改,删除操作)

rabbitMQ的下载&#xff0c;安装和配置 https://blog.csdn.net/m0_67930426/article/details/134892759?spm1001.2014.3001.5502 rabbitMQ控制台模拟收发消息 https://blog.csdn.net/m0_67930426/article/details/134904365?spm1001.2014.3001.5502 目录 用户 添加用户…...

Pydantic序列化避坑指南:model_dump vs dict、exclude/include高级用法与SerializeAsAny解析

Pydantic序列化避坑指南&#xff1a;model_dump vs dict、exclude/include高级用法与SerializeAsAny解析 在Python生态中&#xff0c;Pydantic已经成为数据验证和序列化的标杆工具。但许多开发者在实际使用中&#xff0c;常常会遇到一些看似简单却容易踩坑的序列化问题。本文将…...

矩池云实战: 用Gemma 4 + Open WebUI打造你的私人OpenAI

在开源 AI 生态中&#xff0c;如何不依赖闭源 API&#xff0c;纯靠开源堆栈搭建出一套具备“深度思考&#xff08;CoT&#xff09;&原生多模态顶配开发环境&#xff1f; 答案是&#xff1a;Ollama Gemma-4-31B Open WebUI Ollama Gemma-4-31B Open WebUI 的真正核心价…...

SAP HR数据维护避坑指南:HR_INFOTYPE_OPERATION函数调用前后的缓存与锁管理详解

SAP HR数据维护避坑指南&#xff1a;HR_INFOTYPE_OPERATION函数调用前后的缓存与锁管理详解 在SAP HR模块的日常开发与运维中&#xff0c;数据维护操作看似简单却暗藏玄机。许多开发者在调用HR_INFOTYPE_OPERATION函数进行人事信息类型操作时&#xff0c;常常忽略前后必要的缓存…...

Atomic-Server API完全参考:开发者必备的接口文档指南

Atomic-Server API完全参考&#xff1a;开发者必备的接口文档指南 【免费下载链接】atomic-server An open source headless CMS / real-time database. Powerful table editor, full-text search, and SDKs for JS / React / Svelte. 项目地址: https://gitcode.com/gh_mirr…...

Ftrace事件跟踪配置与性能分析实战指南

1. events-ftrace.xml文件属性详解events-ftrace.xml是Arm Development Studio和DS-5 Development Studio中用于配置ftrace事件跟踪的关键配置文件。这个文件定义了如何捕获、解析和显示内核跟踪事件。理解其中各个属性的作用对于性能分析和系统调试至关重要。1.1 核心属性解析…...

DeepSeek OCR:文档智能处理的成本革命与工程落地

1. 这不是又一个OCR工具&#xff0c;而是一次成本结构的重写DeepSeek OCR这个名字刚出来时&#xff0c;我第一反应是&#xff1a;又一个堆参数的模型&#xff1f;点开官网文档扫了一眼&#xff0c;发现它连“支持PDF”这种基础描述都懒得写——因为PDF只是输入格式里最不值一提…...

MySQL调优实战:MySQL日志机制深入解析,redo/undo/binlog/slow/error日志底层全通透

一、MySQL五大日志总览&#xff08;全局认知&#xff09;MySQL 日志严格分为两层&#xff1a;Server层日志 InnoDB引擎层日志。这是90%人混淆的根源&#xff1a;1.1 Server层日志&#xff08;所有引擎通用&#xff09;Binlog&#xff08;二进制日志&#xff09;&#xff1a;主…...

基于瑞萨R8C MCU的180度电角度无感FOC BLDC电机控制方案详解

1. 项目概述与核心需求解析大家好&#xff0c;我是老王&#xff0c;一个在电机控制和嵌入式系统开发领域摸爬滚打了十几年的工程师。今天想和大家深入聊聊一个非常具体且有意思的项目&#xff1a;如何基于瑞萨电子的R8C系列MCU&#xff0c;来实现一套180度电角度控制的无刷直流…...

Photoshop‌2022安装教程

ps是一款使用率很高的设计工具&#xff0c;此篇分享一下Windows2022版本的安装教程 1、下载的压缩包解压2、右键以管理员身份运行Set-up.exe3、选择语言及安装位置&#xff08;建议安装在系统盘C以外的其他磁盘&#xff09;4、继续安装&#xff0c;等待安装完成点击关闭即可5、…...

2026年ERP+分销一体化还是独立部署?两种架构的优劣对比与选型建议

分销ERP的选型是一个典型的“三年决策”——今天选了什么&#xff0c;未来三年就要和它绑定。选小了&#xff0c;业务一扩张系统就撑不住&#xff1b;选大了&#xff0c;为用不上的功能付了高昂成本。更棘手的困境是“换系统”——已经跑了好几年的业务数据和流程&#xff0c;迁…...