当前位置: 首页 > 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开发指南(二):…...

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

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

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...