Django 的 `Meta` 类和外键的使用
Django 的 `Meta` 类和外键的使用
- 1. `Meta` 类的常用选项
- 2. 外键(ForeignKey)字段的使用
- 2.1 基本用法
- 2.2 `ForeignKey` 参数
- 2.3 外键删除选项(`on_delete`)
- 3. 外键和查询
- 3.1 获取作者的所有书籍
- 3.2 通过书籍查找作者
- 3.3 使用 `select_related` 优化查询
- 总结
在 Django 中,Meta
类是模型的一个内部类,用来配置模型的行为和一些数据库选项。通过在模型中定义 Meta
类,你可以控制模型的一些特性,如数据库表名、排序方式、索引、唯一约束等。
1. Meta
类的常用选项
以下是 Meta
类中常用的配置选项:
-
db_table
:指定数据库表的名称。如果没有指定,Django 会默认使用模型类名的小写形式作为表名。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()class Meta:db_table = 'tank_table' # 指定数据库表名
-
ordering
:指定模型数据的默认排序方式。它接受一个字段名的列表(可以带负号表示降序)。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()class Meta:ordering = ['-speed'] # 按照速度降序排列
-
verbose_name
和verbose_name_plural
:用于指定模型的单数和复数形式的可读名称,通常用于 Django 管理后台显示模型名称。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()class Meta:verbose_name = 'Tank'verbose_name_plural = 'Tanks'
-
unique_together
:指定多个字段组合成的联合唯一约束。Django 会确保这组字段的组合在数据库中是唯一的。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()class Meta:unique_together = ['name', 'speed'] # 确保每个name和speed组合是唯一的
-
index_together
:为多个字段组合创建数据库索引,提高查询效率。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()class Meta:index_together = ['name', 'speed'] # 为name和speed创建联合索引
-
permissions
:指定模型的权限。这会在auth_permission
表中创建自定义权限。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()class Meta:permissions = [("can_drive", "Can drive the tank"),("can_fight", "Can fight with the tank")]
-
default_manager_name
:设置默认的管理器名称,Django 会在模型类中自动创建objects
管理器。如果你有多个管理器,可以通过这个选项指定默认的一个。class Tank(models.Model):name = models.CharField(max_length=100)speed = models.FloatField()active_tanks = models.Manager() # 自定义管理器class Meta:default_manager_name = 'active_tanks' # 使用自定义的管理器
2. 外键(ForeignKey)字段的使用
Django 的 ForeignKey
字段用于表示模型之间的“一对多”关系。在外键关系中,一个对象可以关联多个对象,常用于表示父子表关系。
2.1 基本用法
ForeignKey
用于表示两个模型之间的外键关系。通常情况下,它会生成一个新的字段,在数据库中存储关联对象的主键(id
)。
假设我们有两个模型:Author
和 Book
。每本书都由一个作者编写,因此我们需要在 Book
模型中添加一个外键字段,指向 Author
模型。
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE) # 外键关系,关联到 Author 模型def __str__(self):return self.title
2.2 ForeignKey
参数
to
:指定外键关联的模型类。可以是另一个模型的类名或字符串(例如'Author'
)。on_delete
:当关联对象(如作者)被删除时,当前对象(如书籍)该如何处理。常见的选项包括:models.CASCADE
:级联删除,删除父对象时删除所有关联的子对象。models.PROTECT
:阻止删除父对象,如果该对象仍被引用。models.SET_NULL
:将外键字段设置为NULL
(前提是该字段允许为NULL
)。models.SET_DEFAULT
:将外键字段设置为默认值。models.SET()
:可以设置一个特定的值。
related_name
:为反向关系定义名称。即通过外键模型,可以反向查询到当前模型实例的集合。默认情况下,Django 会使用模型名的小写形式加上_set
作为反向查询的名称。related_query_name
:用于在查询时指定反向关系的名称。null
:如果为True
,外键可以为空。blank
:如果为True
,字段可以在表单中为空。
例如,添加 related_name
来进行反向查询:
class Author(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books') # 定义反向查询名称def __str__(self):return self.title
现在,如果你有一个 author
实例,你可以通过 author.books.all()
获取该作者所有的书籍:
author = Author.objects.get(id=1)
books_by_author = author.books.all() # 获取该作者所有的书籍
2.3 外键删除选项(on_delete
)
当父对象被删除时,Django 会根据你设置的 on_delete
参数来处理外键关系。以下是常用的 on_delete
选项:
-
models.CASCADE
:删除父对象时,删除所有引用该父对象的子对象。author = Author.objects.get(id=1) author.delete() # 删除作者时,所有关联的书籍也会被删除
-
models.PROTECT
:如果该父对象仍被引用,禁止删除父对象。author = Author.objects.get(id=1) author.delete() # 如果有书籍关联,删除时会引发异常
-
models.SET_NULL
:将外键字段设置为NULL
。需要确保外键字段允许NULL
。class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
-
models.SET_DEFAULT
:将外键字段设置为默认值。class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.SET_DEFAULT, default=1)
-
models.SET()
:你可以指定一个函数或值,当父对象删除时,外键字段会设置为指定的值。class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.SET('Unknown Author'))
3. 外键和查询
在 Django 中,你可以轻松地使用外键字段进行查询。例如:
3.1 获取作者的所有书籍
author = Author.objects.get(id=1)
books = author.books.all() # 获取该作者的所有书籍
3.2 通过书籍查找作者
book = Book.objects.get(id=1)
author = book.author # 获取书籍的作者
3.3 使用 select_related
优化查询
如果你查询外键字段时,经常会发起额外的数据库查询。你可以使用 select_related
来一次性加载相关的外键数据,减少查询次数。
books = Book.objects.select_related('author').all() # 一次性查询所有书籍及其对应的作者
总结
Meta
类用于在模型中配置数据库表的选项,如表名、排序、索引等。- 外键字段(
ForeignKey
)用于表示模型之间的“一对多
相关文章:
Django 的 `Meta` 类和外键的使用
Django 的 Meta 类和外键的使用 1. Meta 类的常用选项2. 外键(ForeignKey)字段的使用2.1 基本用法2.2 ForeignKey 参数2.3 外键删除选项(on_delete) 3. 外键和查询3.1 获取作者的所有书籍3.2 通过书籍查找作者3.3 使用 select_rel…...
DP动态规划字典版递归
https://blog.csdn.net/m0_74408723/article/details/145303575?spm1001.2014.3001.5501 一只青蛙,可以一次跳上1级台阶,也可以一次跳上2级台阶。求这只青蛙跳10级台阶有多少种跳法? 优化上一篇青蛙跳台阶问题。可以采用Map字典存放f(n-1)f(…...
图论 八字码
我们可能惊异于某些技巧。我们认为这个技巧真是巧妙啊。或者有人认为我依靠自己的直觉想出了这个表示方法。非常自豪。我认为假设是很小的时候,比如说小学初中,还是不错的。到高中大学,就有一些不成熟了。因为这实际上是一个竞技。很多东西前…...
Vscode:问题解决办法 及 Tips 总结
Visual Studio Code(简称VSCode)是一个功能强大的开源代码编辑器,广泛用于各种编程语言和开发场景,本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法,使用过程中的技巧 文章目录 扩展安装失败调试配…...
Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)
本文讲了如何在Excel中抠图头像,换背景色。 1,如何在Excel中抠图头像,换背景色 大家都知道在PS中可以很容易抠图头像,换背景色,其实Excel中也可以抠简单的图,换背景色。 ※所用头像图片为百度搜索&#x…...
vue项目动态div滚动条滑动到指定位置效果
标题首先我们得明确几个知识点 element.scrollIntoView this.$el.querySelector 文档对象模型Document引用的 querySelector() 方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。如果找不到匹配项,则返回null。 用来匹配动态document 代码 // t…...
2K高刷电竞显示器怎么选?
2K高刷电竞显示器怎么选?哪个价格适合你?哪个配置适合你呢? 1.HKC G27H2Pro - 2K高刷电竞显示器怎么选 外观设计 - HKC G27H2Pro 2K高刷电竞显示器 电竞风拉满:作为猎鹰系列的一员,背部 “鹰翼图腾” 切割线搭配炎红…...
Codeforces Round 1000 (Div. 2)-C题(树上两个节点不同边数最大值)
https://codeforces.com/contest/2063/problem/C 牢记一棵树上两个节点如果相邻,它们有一条边会重叠,两个节点延伸出去的所有不同边是两个节点入度之和-1而不是入度之和,那么如果这棵树上有三个节点它们的入度都相同,那么优先选择非相邻的两个节点才能使所有不同边的数量最大!!…...
【2024年华为OD机试】 (E卷,200分) - 寻找符合要求的最长子串(JavaScriptJava PythonC/C++)
一、问题描述 给定一个字符串 s,找出满足以下条件的最长子串: 任意一个字符最多出现2次:子串中的每个字符在子串中出现的次数不能超过2次。子串不包含指定字符:子串不能包含输入的指定字符。 请找出满足该条件的最长子串的长度…...
c++常见设计模式之装饰器模式
基础介绍 装饰器模式是结构型设计模式,从字面意思看装饰器设计模式就是用来解决在原有的实现基础上添加一些额外的实现的问题。那么正统的概念是什么呢?装饰器模式允许我们动态的向对象添加新的 行为,同时不改变其原有的结构。它是一种比继承…...
如何在Python中进行数据分析?
数据分析是现代数据科学中的核心环节之一,它能够帮助我们从数据中提取有价值的信息,并为决策提供依据。在Python中,进行数据分析非常方便,因为Python有着丰富的库和工具,能够帮助处理和分析各种类型的数据。本篇文章将…...
linux网络 | 传输层TCP | 认识tcp报头字段与分离
前言: 本节内容继续传输层的讲解, 本节讲解的是tcp协议。 tcp协议是我们日常中最常用的协议。就比如我们浏览网页,我们知道网页时http或者https协议。 其实http或者https底层就是用的tcp协议。tcp协议,全名又称为传输控制协议&…...
定位,用最通俗易懂的方法2.1:CRLB实例
二郎就不设置什么VIP可见啥的了,这样大家都能看到。 如果觉得受益,可以给予一些打赏,也算对原创的一些鼓励,谢谢。 钱的用途:1)布施给他人;2)二郎会有更多空闲时间写教程 起因&…...
深入内核讲明白Android Binder【三】
深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …...
vim如何显示行号
:set nu 显示行号 :set nonu 不显示行号...
【线性代数】列主元法求矩阵的逆
列主元方法是一种用于求解矩阵逆的数值方法,特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵,然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤: [精确算法] 列主元高斯消元法 步骤 1&am…...
T-SQL语言的数据库编程
T-SQL语言的数据库编程 1. 引言 在信息化迅速发展的今天,数据库已经成为数据管理和使用的重要工具。其中,T-SQL(Transact-SQL)作为微软SQL Server的扩展SQL语言,不仅用于数据查询和管理,还能够进行复杂的…...
【Linux】18.Linux进程控制(2)
文章目录 3. 进程程序替换3.1 单进程版 -- 看看程序替换3.2 替换原理3.3 替换函数函数解释命名理解 3.4 多进程版 -- 验证各种程序替换接口3.5 自定义shell 3. 进程程序替换 3.1 单进程版 – 看看程序替换 makefile mycommand:mycommand.cgcc -o $ $^ -stdc99 .PHONY:clean …...
在 Ubuntu 上安装 MySQL 的详细指南
在Ubuntu环境中安装 mysql-server 以及 MySQL 开发包(包括头文件和动态库文件),并处理最新版本MySQL初始自动生成的用户名和密码,可以通过官方的APT包管理器轻松完成。以下是详细的步骤指南,包括从官方仓库和MySQL官方…...
Hive: Hive的优缺点,使用方式,判断Hive是否启动(jps),元数据的存储,Hive和Hadoop的关系
hive 是一个构建在 Hadoop 上的数据仓库 工具 ( 框架 ) ,可以将结构化的数据文件映射成一张数据表,并可以使用类sql 的方式来对这样的数据文件进行读,写以及管理(包括元数据)。这套 HIVE SQL 简称 HQL。 hive 的执行引…...
Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译
概要 行人遵循不同轨迹以避免障碍物和容纳同行者。任何在这种场景中巡航的自动驾驶车辆都需要能够遇见行人的未来位置并相应地调整其路线以避免碰撞。轨迹预测问题能够被看作一个顺序生成任务,其中我们对基于行人过去的位置预测其未来的轨迹感兴趣。根据最近RNN&am…...
前后端交互过程
一、前后端交互过程 前后端交互是指客户端(前端)与服务器(后端)之间的数据通信。以下是一个典型的前后端交互流程: 前端请求: 用户在浏览器上与前端界面交互,如点击按钮、提交表单。前端使用 A…...
【计算机视觉】人脸识别
一、简介 人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。 人脸识别属于1:N的比对,输入人脸身份是1&…...
Spark Streaming的核心功能及其示例PySpark代码
Spark Streaming是Apache Spark中用于实时流数据处理的模块。以下是一些常见功能的实用PySpark代码示例: 基础流处理:从TCP套接字读取数据并统计单词数量 from pyspark import SparkContext from pyspark.streaming import StreamingContext# 创建Spar…...
高效实现 Markdown 转 PDF 的跨平台指南20250117
高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐,但如何将其转换为易于分享和打印的 PDF 格式,是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法,并探讨…...
冯诺依曼架构和哈佛架构的主要区别?
冯诺依曼架构(Von Neumann Architecture)和哈佛架构(Harvard Architecture)是两种计算机体系结构,它们在存储器组织、指令处理和数据存取等方面有明显的不同。以下是它们的主要区别: 1.存储器结构 冯诺依曼…...
AI 新动态:技术突破与应用拓展
目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代,人工智能(AI)无疑是最具影响力的领域之一。AI 技…...
Java锁 从乐观锁和悲观锁开始讲 面试复盘
目录 面试复盘 Java 中的锁 大全 悲观锁 专业解释 自我理解 乐观锁 专业解释 自我理解 悲观锁的调用 乐观锁的调用 synchronized和 ReentrantLock的区别 相同点 区别 详细对比 总结 面试复盘 Java 中的锁 大全 悲观锁 专业解释 适合写操作多的场景 先加锁可以…...
【RabbitMq】RabbitMq高级特性-延迟消息
延迟消息 什么是延迟消息死信交换机延迟消息插件-DelayExchange其他文章 什么是延迟消息 延迟消息:发送者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。 延迟任务:设置在一定时间之后才执行的任…...
MindAgent:基于大型语言模型的多智能体协作基础设施
2023-09-18 ,加州大学洛杉矶分校(UCLA)、微软研究院、斯坦福大学等机构共同创建的新型基础设施,目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准,调度多智…...
Linux内存管理(Linux内存架构,malloc,slab的实现)
文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念:分页管理的核心概念:Linux 中分页的实现:总结: 六、伙伴算法伙伴算法的核心…...
【机器学习实战中阶】比特币价格预测
比特币价格预测项目介绍 比特币价格预测项目是一个非常有实用价值的机器学习项目。随着区块链技术的快速发展,越来越多的数字货币如雨后春笋般涌现,尤其是比特币作为最早的加密货币,其价格波动备受全球投资者和研究者的关注。本项目的目标是…...
【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例
在Java应用程序的性能调优和故障排查中,jmap(Java Memory Map)是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况,生成堆转储文件(Heap Dump),并查看内存中的对象分布。无论是内…...
使用vscode在本地和远程服务器端运行和调试Python程序的方法总结
1 官网下载 下载网址:https://code.visualstudio.com/Download 如下图所示,可以分别下载Windows,Linux,macOS版本 历史版本下载链接: https://code.visualstudio.com/updates 2 安装Python扩展工具 打开 VS Code,安装 Microsoft 提供的官…...
AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式
Cursor AI 对话模式详解:Chat、Composer 与 Normal/Agent 模式 一、简介 Cursor 是一个强大的 AI 辅助编程工具,它提供了多种对话模式来满足不同的开发需求。主要包括: Chat 模式:直接对话交互Composer 模式:结构化编程助手Normal/Agent 模式:不同的 AI 响应策略打开Ch…...
【MySQL】数据库基础知识
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】数据库基础知识 发布时间:2025.1.21 隶属专栏:MySQL 目录 什么是数据库为什么要有数据库数据库的概念 主流数据库mysql的安装mysql登录使用一下mysql显示数据库内容创建一个数据库创…...
ChatGPT开发教程指南
ChatGPT开发教程指南 一、ChatGPT 概述二、开发环境搭建(一)硬件要求(二)软件要求 三、开发流程(一)数据处理(二)模型选择与训练(三)接口开发 四、示例代码 随…...
OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?
OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…...
spring cloud如何实现负载均衡
在Spring Cloud中,实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的,但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...
LeetCode:37. 解数独
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则ÿ…...
如何在idea中搭建SpringBoot项目
如何在idea中快速搭建SpringBoot项目 目录 如何在idea中快速搭建SpringBoot项目前言一、环境准备:搭建前的精心布局 1.下载jdk (1)安装JDK:(2)运行安装程序:(3)设置安装…...
STM32补充——FLASH
目录 1.内部FLASH构成(F1) 2.FLASH读写过程(F1) 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器(写入 & 擦除相关) 3.FLASH相关HAL库函数简介(F1/F4/F7/H7) 4.编程实战 …...
ASP.NET Core 中的 JWT 鉴权实现
在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.…...
Docker配置国内镜像源
访问docker hub需要科学上网 在 Docker 中配置镜像地址(即镜像加速器)可以显著提升拉取镜像的速度,尤其是在国内访问 Docker Hub 时。以下是详细的配置方法: 1. 配置镜像加速器 Docker 支持通过修改配置文件来添加镜像加速器地址…...
qiankun+vite+vue3
基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…...
如何使用AI工具cursor(内置ChatGPT 4o+claude-3.5)
⚠️温馨提示: 禁止商业用途,请支持正版,充值使用,尊重知识产权! 免责声明: 1、本教程仅用于学习和研究使用,不得用于商业或非法行为。 2、请遵守Cursor的服务条款以及相关法律法规。 3、本…...
Linux内核编程(二十一)USB驱动开发-键盘驱动
一、驱动类型 USB 驱动开发主要分为两种:主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备,而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…...
vue3+ts watch 整理
watch() 一共可以接受三个参数,侦听数据源、回调函数和配置选项 作用:监视数据的变化(和Vue2中的watch作用一致) 特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。 reactive定义的数据。 函数返…...
2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程
本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…...
USART_串口通讯轮询案例(HAL库实现)
引言 前面讲述的串口通讯案例是使用寄存器方式实现的,有利于深入理解串口通讯底层原理,但其开发效率较低;对此,我们这里再讲基于HAL库实现的串口通讯轮询案例,实现高效开发。当然,本次案例需求仍然和前面寄…...