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开发指南(二):…...
大厂趋势:低代码不等于低能力,赋能高效开发新纪元
大厂趋势:低代码不等于低能力,赋能高效开发新纪元 在数字化转型的浪潮中,科技巨头(大厂)作为行业的引领者,不断探索和创新,以应对日益复杂多变的市场需求和技术挑战。其中,“低代码…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
