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

django之ForeignKey、OneToOneField 和 ManyToManyField

在Django中,ForeignKeyOneToOneFieldManyToManyField 是用于定义模型之间关系的字段类型。

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. 懒汉式 (三)创建型模式:单例模式 单例模式在于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在某些情况下&#xff0…...

基于Android Studio的行程记录APK开发指南(三)---界面设计及两种方法获取用户位置

前言 本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录 第一期:基于Android Studio的用户行程记录APK开发指南(一):项目基础配置与速通Kotlin-CSDN博客第二期:基于Android Studio的行程记录APK开发指南(二):…...

大厂趋势:低代码不等于低能力,赋能高效开发新纪元

大厂趋势:低代码不等于低能力,赋能高效开发新纪元 在数字化转型的浪潮中,科技巨头(大厂)作为行业的引领者,不断探索和创新,以应对日益复杂多变的市场需求和技术挑战。其中,“低代码…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

macOS 终端智能代理检测

🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...