django之ForeignKey、OneToOneField 和 ManyToManyField
在Django中,ForeignKey、OneToOneField 和 ManyToManyField 是用于定义模型之间关系的字段类型。
ForeignKey
ForeignKey 用于定义多对一的关系。例如,一个Employee可以属于一个Department,一个Department可以有多个Employee。
from django.db import modelsclass Department(models.Model):name = models.CharField(max_length=100)class Employee(models.Model):name = models.CharField(max_length=100)department = models.ForeignKey(Department, on_delete=models.CASCADE, # 当 Department 被删除时,级联删除关联的 Employeerelated_name='employees', # 反向关系的名称,可以通过 department.employees.all() 获取所有关联的 Employeerelated_query_name='employee', # 反向关系的查询名称,可以通过 Department.objects.filter(employee__name='John') 查询limit_choices_to={'name__icontains': 'Engineering'}, # 限制可选的 Department 对象db_constraint=True, # 是否在数据库中创建外键约束,默认为 Trueswappable=True, # 是否允许模型在 INSTALLED_APPS 中被替换,默认为 Trueverbose_name='Department', # 字段的可读名称help_text='Select the department for the employee', # 帮助文本db_index=True # 是否在数据库中为该字段创建索引,默认为 True)position = models.CharField(max_length=100, default='Employee')# 示例数据
engineering = Department.objects.create(name='Engineering')
hr = Department.objects.create(name='Human Resources')# 创建 Employee 对象
john = Employee.objects.create(name='John Doe', department=engineering)
jane = Employee.objects.create(name='Jane Smith', department=hr)# 通过反向关系获取所有属于 Engineering 部门的员工
engineering_employees = engineering.employees.all()# 通过反向查询获取名字为 John 的员工
john_employees = Department.objects.filter(employee__name='John')
to: 这里是Department模型,表示Employee关联到Department。on_delete=models.CASCADE: 当Department被删除时,级联删除关联的Employee。related_name='employees': 通过department.employees.all()可以获取所有关联的Employee。related_query_name='employee': 通过Department.objects.filter(employee__name='John')可以查询关联的Employee。limit_choices_to={'name__icontains': 'Engineering'}: 仅允许选择名称包含 “Engineering” 的Department对象。db_constraint=True: 在数据库中创建外键约束。swappable=True: 允许模型在INSTALLED_APPS中被替换。verbose_name='Department': 字段的可读名称。help_text='Select the department for the employee': 帮助文本。db_index=True: 在数据库中为该字段创建索引。
OneToOneField
OneToOneField 用于定义一对一的关系。例如,一个用户可以有一个用户配置文件。
from django.db import modelsclass User(models.Model):username = models.CharField(max_length=100)class UserProfile(models.Model):user = models.OneToOneField(User, on_delete=models.CASCADE, # 当 User 被删除时,级联删除关联的 UserProfilerelated_name='profile', # 反向关系的名称,可以通过 user.profile 获取关联的 UserProfilerelated_query_name='profile', # 反向关系的查询名称,可以通过 User.objects.filter(profile__bio='Developer') 查询limit_choices_to={'username__icontains': 'admin'}, # 限制可选的 User 对象db_constraint=True, # 是否在数据库中创建外键约束,默认为 Trueswappable=True, # 是否允许模型在 INSTALLED_APPS 中被替换,默认为 Trueprimary_key=False, # 是否将该字段设置为主键,默认为 Falseverbose_name='User', # 字段的可读名称help_text='Select the user for the profile', # 帮助文本db_index=True # 是否在数据库中为该字段创建索引,默认为 True)bio = models.TextField()# 示例数据
user1 = User.objects.create(username='admin_user')
user2 = User.objects.create(username='regular_user')# 创建 UserProfile 对象
profile1 = UserProfile.objects.create(user=user1, bio='Administrator')
profile2 = UserProfile.objects.create(user=user2, bio='Regular User')# 通过反向关系获取 user1 的 UserProfile
admin_profile = user1.profile# 通过反向查询获取 bio 为 'Administrator' 的用户
admin_users = User.objects.filter(profile__bio='Administrator')
to: 这里是User模型,表示UserProfile关联到User。on_delete=models.CASCADE: 当User被删除时,级联删除关联的UserProfile。related_name='profile': 通过user.profile可以获取关联的UserProfile。related_query_name='profile': 通过User.objects.filter(profile__bio='Developer')可以查询关联的UserProfile。limit_choices_to={'username__icontains': 'admin'}: 仅允许选择用户名包含 “admin” 的User对象。db_constraint=True: 在数据库中创建外键约束。swappable=True: 允许模型在INSTALLED_APPS中被替换。primary_key=False: 不将该字段设置为主键。verbose_name='User': 字段的可读名称。help_text='Select the user for the profile': 帮助文本。db_index=True: 在数据库中为该字段创建索引。
ManyToManyField
ManyToManyField 用于定义多对多的关系。例如,一个学生可以选修多门课程,一门课程可以有多个学生选修。
from django.db import modelsclass Course(models.Model):name = models.CharField(max_length=100)class Student(models.Model):name = models.CharField(max_length=100)courses = models.ManyToManyField(Course, related_name='students', # 反向关系的名称,可以通过 course.students.all() 获取所有关联的 Studentrelated_query_name='student', # 反向关系的查询名称,可以通过 Course.objects.filter(student__name='John') 查询limit_choices_to={'name__icontains': 'Math'}, # 限制可选的 Course 对象db_table='student_courses', # 自定义中间表的名称db_constraint=True, # 是否在数据库中创建外键约束,默认为 Trueswappable=True, # 是否允许模型在 INSTALLED_APPS 中被替换,默认为 Trueverbose_name='Courses', # 字段的可读名称help_text='Select the courses for the student', # 帮助文本symmetrical=False, # 是否为对称关系,默认为 True。通常在自引用多对多关系中使用through=None, # 自定义中间模型through_fields=None, # 指定中间模型的字段)# 示例数据
math_course = Course.objects.create(name='Mathematics')
science_course = Course.objects.create(name='Science')# 创建 Student 对象
john = Student.objects.create(name='John Doe')
jane = Student.objects.create(name='Jane Smith')# 关联课程
john.courses.add(math_course)
jane.courses.add(math_course, science_course)# 通过反向关系获取所有选修 Mathematics 课程的学生
math_students = math_course.students.all()# 通过反向查询获取名字为 John 的学生
john_students = Course.objects.filter(student__name='John')
to: 这里是Course模型,表示Student关联到Course。related_name='students': 通过course.students.all()可以获取所有关联的Student。related_query_name='student': 通过Course.objects.filter(student__name='John')可以查询关联的Student。limit_choices_to={'name__icontains': 'Math'}: 仅允许选择名称包含 “Math” 的Course对象。db_table='student_courses': 自定义中间表的名称。db_constraint=True: 在数据库中创建外键约束。swappable=True: 允许模型在INSTALLED_APPS中被替换。verbose_name='Courses': 字段的可读名称。help_text='Select the courses for the student': 帮助文本。symmetrical=False: 这里设置为False,因为这是一个非对称关系(学生和课程的关系不是对称的)。through=None: 不使用自定义中间模型。through_fields=None: 不指定中间模型的字段。
相关文章:
django之ForeignKey、OneToOneField 和 ManyToManyField
在Django中,ForeignKey、OneToOneField 和 ManyToManyField 是用于定义模型之间关系的字段类型。 ForeignKey ForeignKey 用于定义多对一的关系。例如,一个Employee可以属于一个Department,一个Department可以有多个Employee。 from djang…...
java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X
1,可能是EditText,setSelection(x)时超过了 输入框内容的实际长度导致的。 2,手机开启“拼写检查功能”,EditText设置了最大长度,选择提示的某一项文案时超过设置的最大长度限制,导致崩溃。 针对情况2 开…...
技术进展:CH-90树脂在去除硫酸钠柠檬酸钠溶液中铁锰离子上的应用
随着环境保护法规的日趋严格,以及工业生产中对产品纯度要求的不断提高,去除废水中的重金属离子已成为一个亟待解决的问题。铁和锰作为常见的杂质离子,在电池制造等行业中,对溶液纯度的影响不容忽视。 三元前驱体废水中通常含有硫…...
录屏时摄像头无法识别?如何录屏时打开摄像头,解决方案及录屏软件推荐
在数字时代,无论是游戏玩家、在线教育者还是企业培训师,录屏软件都已成为日常工作和娱乐中不可或缺的工具。但有时候想录制人物摄像头画面的时候,当录屏软件无法识别到摄像头时,这无疑会给用户带来不小的困扰。本文将提供一系列解…...
达梦数据库-DM8 企业版安装指南
一、DM8 企业版简介 达梦数据库(DM8)是中国自主研发的一款高性能数据库管理系统,广泛应用于企业级应用场景。DM8 企业版具备高可用性、强一致性和高性能等特点,支持多种操作系统和硬件平台。本文将详细介绍如何在 Kylin 操作系统上安装达梦数据库 DM8 企业版。 二、安装前…...
心脑血管科董田林医生:心律失常患者饮食,调养秘诀,助你找回健康心跳
在纷繁复杂的健康议题中,心律失常作为一种常见的心脏疾病,不仅影响着患者的生活质量,更牵动着每一个家庭的神经。幸运的是,通过科学合理的饮食调养,心律失常患者可以在很大程度上改善病情,逐步找回健康的心…...
期权杂记(一)
2024年9月5日: 切忌裸奔!如果你想暴富,押注期权还不如去澳门;做任何策略都可以多多关注希腊字母;对冲也是又方向性的,可以偏购,也可以偏沽,通过Delta Money来尝试计算;单…...
【MATLAB源码-第163期】基于matlab的BPSK+瑞利(rayleigh)信道下有无波束成形误码率对比仿真。
操作环境: MATLAB 2022a 1、算法描述 在通信系统中,波束成形(Beamforming)技术是一种广泛使用的信号处理技术,通过调整天线阵列中各个元素的相位和幅度,使得信号在特定方向上增强,在其他方向…...
【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)
空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据、2013-2022年的省市县三级的逐日SO2数据、2008-2022年我国省市县三级的逐日NO2数据和2000-2022年我国省市县三级…...
Python 的http.server库详细介绍
http.server 是 Python 标准库中的一个模块,用于创建基本的 HTTP 服务器。这个模块非常适合用于开发、测试、以及在本地网络中共享文件。以下是对 http.server 模块的详细介绍。 Python 官方文档:http.server — HTTP 服务器 模块概述 http.server 提…...
使用ffmpeg在视频中绘制矩形区域
由于项目需要对视频中的人脸做定位跟踪, 我先使用了人脸识别算法,对视频中的每个帧识别人脸、通过人脸库比对,最终记录坐标等信息。 然后使用ffmpeg中的 drawbox 滤镜功能,选择性的绘制区域。从而实现人脸定位跟踪 1、drawbox …...
计算机,数学,AI在社会模拟中的应用
这些模型通常属于社会模拟的范畴,利用计算机技术和复杂系统理论来模拟和预测社会动态。以下是几种常见的社会模拟模型: 1. 系统动力学模型 系统动力学模型通过建立数学方程来描述社会系统中的各种变量及其相互关系。这种模型适用于宏观层面的社会变化分…...
【数据结构】排序算法系列——插入排序(附源码+图解)
插入排序 算法思想 插入排序的算法思想其实很容易理解,它秉持着一个不变的循环:比较->交换->比较->交换…因为我们排序最终的目的是要得到递增或者递减的数据,那么在原有的数据中,我们可以将数据依次两两进行比较&…...
TOMATO靶机漏洞复现
步骤一,我们来到tomato页面 什么也弄不了只有一番茄图片 弱口令不行,xxs也不行,xxe还是不行 我们来使用kali来操作... 步骤二,使用dirb再扫一下, dirb http://172.16.1.133 1.发现这个文件可以访问.我们来访问一下 /antibot_i…...
高基数 GroupBy 在 SLS SQL 中的查询加速
作者:顾汉杰(执少) 什么是高基数 GroupBy 简单来说,想要分析的数据,拥有超多的“唯一值计数”(Distinct Count),而我们需要对这些数据进行分组分析(如统计次数、排名、…...
TP5队列和TP5 使用redis 等相关
TP5.thinkphp之门面(facade类)面试_thinkphp facade-CSDN博客 TP5中的消息队列_tp 5.0 队列 release 时间单位-CSDN博客 thinkphp-queue自带的队列包使用分析_php think queue:listen-CSDN博客TP5 使用redis_tp5 redis-CSDN博客...
【R语言速通】1.数据类型
文章目录 0. 变量名1.基本数据类型1.1 数值型1.2 整型1.3 复数型1.4 逻辑型1.5 字符型 2.复合数据类型2.1 向量向量操作向量的常用函数 2.2 矩阵矩阵操作矩阵的常用函数 2.3 数组数组的操作数据的运算数组的访问数组的维度操作 数组的常用函数 2.4 数据框数据框操作数据框的常用…...
【C++设计模式】(三)创建型模式:单例模式
文章目录 (三)创建型模式:单例模式饿汉式懒汉式饿汉式 v.s. 懒汉式 (三)创建型模式:单例模式 单例模式在于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在某些情况下࿰…...
基于Android Studio的行程记录APK开发指南(三)---界面设计及两种方法获取用户位置
前言 本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录 第一期:基于Android Studio的用户行程记录APK开发指南(一):项目基础配置与速通Kotlin-CSDN博客第二期:基于Android Studio的行程记录APK开发指南(二):…...
大厂趋势:低代码不等于低能力,赋能高效开发新纪元
大厂趋势:低代码不等于低能力,赋能高效开发新纪元 在数字化转型的浪潮中,科技巨头(大厂)作为行业的引领者,不断探索和创新,以应对日益复杂多变的市场需求和技术挑战。其中,“低代码…...
SmolVLA入门指南:理解config.json中动作维度、图像尺寸等关键参数
SmolVLA入门指南:理解config.json中动作维度、图像尺寸等关键参数 1. 什么是SmolVLA? SmolVLA是一个专门为经济实惠的机器人技术设计的紧凑高效视觉-语言-动作模型。这个模型最大的特点就是在保持高性能的同时,大幅降低了计算资源需求&…...
PyCharm专业开发:调试与集成千问3.5-9B模型调用代码
PyCharm专业开发:调试与集成千问3.5-9B模型调用代码 1. 前言:为什么选择PyCharm进行AI模型开发 PyCharm作为Python开发者最喜爱的IDE之一,在AI模型开发领域有着独特的优势。特别是当我们需要集成像千问3.5-9B这样的大语言模型时,…...
Meta推出Muse Spark,AI领域再掀波澜
Meta告别旧模型,Muse Spark闪亮登场周三,Meta宣布推出Muse系列的首个AI模型——Muse Spark,这标志着Meta彻底告别了之前在开源Llama模型系列上的工作。Llama系列模型在用户和独立大语言模型(LLM)排名中反响平平&#x…...
如何配置分区表的行迁移_ENABLE ROW MOVEMENT允许更新分区键跨区移动
必须开启ENABLE ROW MOVEMENT才能UPDATE分区键并跨分区移动行,否则报ORA-14402;该DDL解禁行迁移能力,实际迁移发生在后续UPDATE时,且需注意全局索引失效、锁影响及提交验证。ALTER TABLE ... ENABLE ROW MOVEMENT 为什么必须开不开…...
Clion高效开发技巧:一键解决多个C/C++文件运行报错问题
Clion高效开发技巧:一键解决多个C/C文件运行报错问题 在C/C开发中,频繁切换测试不同源文件是常态,但每次修改CMakeLists.txt的繁琐操作让许多开发者头疼。今天分享的这套工作流,能让你在Clion中像切换Python脚本一样自由运行任意C…...
如何通过平台架构实现15分钟养老服务圈的精准覆盖
居家养老服务的高效落地,离不开精准的机构定位与便捷的信息查询支撑。智慧养老系统居家养老地图模块,以数字化地图为核心载体,整合区域内养老机构资源与老人基础信息,破解传统居家养老中机构查找繁琐、信息脱节、对接低效等痛点&a…...
Excel设置单元格字体
...
Microsoft Agent Framework Skills 执行 Scripts(实战指南)畔
本文能帮你解决什么? 1. 搞懂FastAPI异步(async/await)到底在什么场景下能真正提升性能。 2. 掌握在FastAPI中正确使用多线程处理CPU密集型任务的方法。 3. 避开常见的坑(比如阻塞操作、数据库连接池耗尽、GIL限制)。 …...
如何理解 WeakSet 不可遍历且没有 size 属性的设计原因
WeakSet 不提供 size 和遍历能力,因其设计目标是“弱存在性登记册”,仅通过 has() 判断对象是否尚未被 GC 回收;size 不稳定、遍历会引发强引用,故规范禁止 clear、迭代器等操作,且只接受对象类型。WeakSet 为什么连 s…...
Qwen3-VL-4B Pro惊艳案例:模糊/低光照图片的高置信度语义还原
Qwen3-VL-4B Pro惊艳案例:模糊/低光照图片的高置信度语义还原 1. 项目简介 Qwen3-VL-4B Pro是基于阿里通义千问Qwen/Qwen3-VL-4B-Instruct模型构建的高性能视觉语言交互服务。相比轻量版的2B模型,这个4B版本在视觉语义理解和逻辑推理能力方面有了显著提…...
