反向查询详解以Django为例
以下给出两张表格
class User(AbstractUser):mobile=models.CharField(max_length=11,default=0,unique=True,verbose_name='手机号')email_active=models.BooleanField(default=False,verbose_name='邮箱验证状态')default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True,on_delete=models.SET_NULL, verbose_name='默认地址')class Meta:db_table = 'tb_users'verbose_name="用户"verbose_name_plural=verbose_namedef __str__(self):return self.usernamefrom utils.models import BaseModel
class Address(BaseModel):
"""用户地址"""user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户')title = models.CharField(max_length=20, verbose_name='地址名称')receiver = models.CharField(max_length=20, verbose_name='收货人')province=models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')place = models.CharField(max_length=50, verbose_name='地址')mobile = models.CharField(max_length=11, verbose_name='手机')tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话')email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱')is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'tb_address'verbose_name = '用户地址'verbose_name_plural = verbose_nameordering = ['-update_time']
问题集:
主键和外键名字为什么不是一模一样
主键是用于唯一标识表中一条记录的字段,而外键是用来建立表与表之间关联的字段。外键的名称通常不会和主键完全相同,主要是为了避免混淆,并且在一个表中可能会有多个外键指向同一张表。例如,在 Address 表中:
province、city、district 都是外键,指向 areas.Area 表。
它们分别表示 省、市、区,虽然都指向同一张表 areas.Area,但代表不同的地址层级,所以它们的名字必须不同,否则会引起歧义。
为什么province,city,district 是外键?
在 Address 表中,province、city 和 district 这三个字段都是指向 areas.Area 表的外键,它们的作用是让每个 Address 记录的省、市、区字段都与 Area 表中的相应区域关联起来。
假设 areas.Area 表的结构如下:
class Area(BaseModel): name = models.CharField(max_length=20, verbose_name="名称") parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name="父级地区")
这样:
province 关联的是 Area 表中的 省级 数据;
city 关联的是 Area 表中的 市级 数据;
district 关联的是 Area 表中的 区县级 数据。
related_name 的作用
related_name 主要用于 Django 进行 反向查询,即:通过 外键关系 反向访问关联的表。默认情况下,Django 通过 外键名_set 进行反向查询,例如 area.address_set.all(),但 related_name 可以自定义这个反向查询的名称,提高代码的可读性和直观性。
在 Address 表中:
province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省') city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市') district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')
表示:
province_addresses:查询所有 该省 下的地址
city_addresses:查询所有 该市 下的地址
district_addresses:查询所有 该区 下的地址
举例
假设 areas.Area 表中有以下数据:
id | name | parent_id |
---|---|---|
1 | 江苏省 | NULL |
2 | 南京市 | 1 |
3 | 玄武区 | 2 |
在 Address 表中,有如下数据:
id | user_id | province | city | district | place |
---|---|---|---|---|---|
1 | 10 | 1 | 2 | 3 | XX路100号 |
如何使用 related_name 进行查询?
# 获取江苏省(id=1)下的所有地址 province = Area.objects.get(id=1) print(province.province_addresses.all()) # 输出:<QuerySet [<Address: XX路100号>]> # 获取南京市(id=2)下的所有地址 city = Area.objects.get(id=2) print(city.city_addresses.all()) # 输出:<QuerySet [<Address: XX路100号>]> # 获取玄武区(id=3)下的所有地址 district = Area.objects.get(id=3) print(district.district_addresses.all()) # 输出:<QuerySet [<Address: XX路100号>]>
如果不使用 related_name,查询方法会变成:
print(province.address_set.all()) # 默认反向查询,名字不直观
所以 related_name 的作用是让查询逻辑更加清晰和直观。
2.什么是正向查询和反向查询
1. 正向查询
正向查询是指通过 外键字段从子表(即引用外键的表)查询父表(即外键所指向的表)中的数据。
在 Django 中,正向查询是从 子模型 到 父模型 的查询。例如,从 Address 表查询某个地址的 province(省),即通过 Address 中的 province 外键字段,查找 Area 表中的 name 字段。
正向查询的例子:
假设我们有以下模型:
class Area(models.Model): name = models.CharField(max_length=100) class Address(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) province = models.ForeignKey(Area, on_delete=models.PROTECT) city = models.ForeignKey(Area, on_delete=models.PROTECT)
如果你想从 Address 查询 province 对应的 Area,你可以执行正向查询:
address = Address.objects.get(id=1) print(address.province.name) # 获取地址的省名
结果:
print(address.province.name) # 输出: 河北省
*2. 反向查询*
反向查询是指从 父表 查询到 子表 关联的数据。在 Django 中,当你在 父模型(即引用外键的表)上使用反向查询时,它会自动创建一个从父模型到子模型的查询方法。
例如,你可以通过 Area 查询所有与某个 province(省)相关的 Address 记录。这里,Area 是父表,而 Address 是子表。
在 Address 模型中,你定义了:
province = models.ForeignKey('Area', on_delete=models.PROTECT, related_name='province_addresses')
related_name='province_addresses' 是反向查询的名字,它允许你通过 Area 查询到所有与该 Area 关联的 Address 记录。
反向查询的例子:
从 Area 查询与之关联的所有 Address,例如查找所有与某个省(province_id)相关的地址:
province = Area.objects.get(id=130000) addresses_in_province = province.province_addresses.all()
结果:
for address in addresses_in_province: print(address.title, address.receiver)
相关文章:
反向查询详解以Django为例
以下给出两张表格 class User(AbstractUser):mobilemodels.CharField(max_length11,default0,uniqueTrue,verbose_name手机号)email_activemodels.BooleanField(defaultFalse,verbose_name邮箱验证状态)default_address models.ForeignKey(Address, related_nameusers, nullT…...
PDP动物性格测试:趣味性格分析工具
PDP动物性格测试:趣味性格分析工具 📝 简介 大家好!今天我想向大家推荐一个有趣且实用的在线工具 —— PDP动物性格测试。这是一个基于PDP(Process Dynamic Pattern)理论的性格测试工具,通过将性格特征与…...
蓝桥杯 完全平方数 刷题笔记
关键分析 --- ### **完全平方数的质因数指数特性** **核心结论**: 一个数是完全平方数,当且仅当它的所有质因数的指数均为偶数。 --- #include <bits/stdc.h> using namespace std; #define int long long int n;signed main(){cin >>…...
C++自学笔记---数组和指针的异同点
数组和指针的异同点 0. 复习一下:指针运算符 * 和 & 我们前两篇有讲过这两个运算符,& 是取地址运算符,* 是解引用运算符。这两个运算符是理解指针的关键,因为它们分别代表了获取变量地址和访问指针指向的值这两个基本操…...
【学习笔记】pytorch强化学习
https://www.bilibili.com/video/BV1zC411h7B8 文章目录 [mcts] 01 mcts 基本概念基本原理(UCB)及两个示例[mcts] 02 mcts from scartch(UCTNode,uct_search, pUCT,树的可视化) [mcts] 01 mcts 基本概念基本…...
C++学习之线程同步
目录 1.线程同步相关概念 2.锁属性-建议锁 3.Mutex互斥锁操作 4.互斥锁使用注意事项 5.互斥量的初始化方法 6.死锁 7.读写锁特性 8.读写锁操作函数 9.读写锁使用示例 10.条件变量操作函数 11.生产者消费者模型简单分析 12.条件变量实现生产者消费者模型代码预览 13…...
定积分的应用(4.39-4.48)
battle cry 前言4.394.404.414.424.434.444.454.464.474.48 前言 题目确实比较多。slow down and take your time. 4.39 狂算了一遍,然后发现不是计算出问题了,是积分上下限写错了。还有把函数代进去也出了一点问题。 点火公式一家人我不记得&#x…...
Java EE期末总结(第三章)
目录 一、JavaBean 1、规范与定义 2、与JavaBean相关的JSP动作标签 二、MV开发模式(JSPJavaBean) 三、Servlet组件 1、Servlet定义 2、基于HTTP请求的Servlet开发 3、Sevlet执行原理 4、控制器程序的分层设计(DAO)模式 5、…...
Data_Socket和UDP_Socket
Data_Socket 和 UDP_Socket 是两种不同类型的网络套接字,它们用于不同的协议和应用场景。以下是它们的主要区别: 协议类型: UDP_Socket:使用的是 UDP(User Datagram Protocol) 协议,这是一种无连…...
6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)
『STEMA考试是蓝桥青少教育理念的一部分,旨在培养学生的知识广度和独立思考能力。考试内容主要考察学生的未来STEM素养、计算思维能力和创意编程实践能力。』 一、选择题 第一题 运行下列哪个程序后,飞机会向左移动? ( ) A. …...
使用MATIO库读取Matlab数据文件中的多维数组
使用MATIO库读取Matlab数据文件中的多维数组 MATIO是一个用于读写Matlab数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库读取Matlab数据文件中的多维数组。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…...
Spring @Transactional 注解是如何工作的?
Transactional 注解是 Spring 框架中用于声明式事务管理的核心注解。它可以应用于类或方法,用于指定事务的属性,例如传播行为、隔离级别、超时时间、只读标志等。下面详细解释 Transactional 注解的工作原理: 1. 启用事务管理: …...
spring security 过滤器链使用
Spring Security 的过滤器链提供了灵活的安全控制机制,以下是其在实际开发中的 常见用法 及对应的过滤器配置示例: 一、认证方式配置 1. 表单登录认证 • 过滤器:UsernamePasswordAuthenticationFilter • 配置: http.formLogi…...
k8s 自动伸缩的场景与工作原理
k8s 自动伸缩的场景与工作原理 在现代云原生架构中,应用的访问量和资源需求常常存在波动。为了解决高峰时资源不足、低谷时资源浪费的问题,Kubernetes 提供了自动伸缩功能。自动伸缩可以根据预设的指标(如 CPU 利用率、内存占用、网络流量等…...
SYN Flooding攻击原理
SYN Flooding攻击原理详解 SYN Flooding(SYN洪泛攻击)是一种典型的拒绝服务攻击(DoS/DDoS),利用TCP协议的三次握手缺陷耗尽目标系统资源。以下是其工作原理、影响及防御措施的全面解析: 1. TCP三次握手回顾…...
【爬虫案例】采集 Instagram 平台数据几种方式(python脚本可直接运行)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、概述1.1 Instagram基础信息1.2 Instagram平台架构核心技术栈1.3 采集提示1.4 几种采集方案对比二、四种采集方案分析三、写爬虫采集Instagram案例3.1 采集作品信息并下载视频或图片(无需登录)3.2 explore接口的采…...
通过构造函数和几何条件,研究了不同函数的最近点存在性、性质及单调性
解: (1)对于函数 f ( x ) 1 x f(x) \frac{1}{x} f(x)x1 和点 M ( 1 , 0 ) M(1, 0) M(1,0),构造函数 s ( x ) ( x − 1 ) 2 ( 1 x ) 2 s(x) (x - 1)^2 \left(\frac{1}{x}\right)^2 s(x)(x−1)2(x1)2。求导得到 s ′ …...
项目复杂业务的数据流解耦处理方案整理
目前项目中使用mobx,项目比较久了,每个Store的内容是越来越多了,逻辑也是越来越复杂,如果不梳理估计以后模块的层级会很乱。 之前整理了一些数据流管理的对比实践和最佳方案的梳理,最后写来写去感觉还是要整理一个架构…...
手部穴位检测技术:基于OpenCV和MediaPipe的实现
手部穴位检测是医学和健康管理领域的重要技术之一。通过准确识别手部的关键穴位,可以为中医诊断、康复治疗以及健康监测提供支持。本文将介绍一种基于OpenCV和MediaPipe的手部穴位检测方法,展示如何利用计算机视觉技术实现手部关键点的检测,并进一步标注手部的穴位位置。 技…...
Pycharm 启动时候一直扫描索引/更新索引 Update index/Scanning files to index
多个项目共用一个虚拟环境,有助于加快PyCharm 启动吗 chatgpt 4o认为很有帮助,gemini 2.5pro认为没鸟用,我更认可gemini的观点。不知道他们谁在一本正经胡说八道。 -------- 打开pycharm的时候,下方的进度条一直显示在扫描文件…...
解锁健康密码,拥抱品质生活
在生活节奏不断加快的今天,健康养生已成为人们关注的焦点。它不仅关乎当下生活质量,更是对未来幸福的投资。从日常生活的点滴出发,掌握正确养生方法,我们就能轻松收获健康。 饮食是健康的基石。我们应当遵循 “食物多样&#x…...
安卓开发工程师- Intent 机制
Intent 的作用是什么? Intent(意图)是 Android 中用于组件之间通信的一种机制。它主要用于以下几种场景: 启动 Activity:从一个 Activity 跳转到另一个 Activity。启动 Service:用于启动后台服务或与服务…...
iOS 使用 - 修改屏幕为黑白显示(墨水屏)
iOS 18 设置 – 辅助功能 – 显示与文字大小 – 色彩滤镜 打开色彩滤镜,选择 灰度,最下方调节 强度值 怀念起那个用电子词典的岁月,一个个字母键入,就可以获得很多知识。 触屏时代,一切好像更简单了,但也更…...
小白速通:Verilog流水线实现及时序分析
目录 题目:时序分析:时钟频率为50MHz数据1: a10, b20, c30, d40, e2数据2: a5, b15, c25, d35, e3数据3: a8, b12, c16, d24, e4 流水线效率分析 题目: verilog中,y(abcd)*e,时钟频率为50Mhz,用流水线的形式…...
微软的 Copilot 现在可以浏览网页并为您执行操作
在庆祝其 50 岁生日之际,微软正在向其人工智能驱动的 Copilot 聊天机器人传授一些新技巧。 从 BASIC 到 AI,改变世界的公司:微软 微软表示,Copilot 现在可以在“大多数网站”上采取行动,使其能够预订门票、预订餐厅等…...
【C++】vector的模拟实现
文章目录 前言一. vector的底层二. 关于容量和大小的函数2.1 size和capacity2.2 reserve2.3 resize2.4 empty 三. vector的默认成员函数3.1 构造函数3.1.1 无参构造函数3.1.2 构造初始化为n个val值3.1.3 用initializer_list构造初始化3.1.4 使用迭代器区间进行构造初始化 3.2 拷…...
C# Winform 入门(9)之如何封装并调用dll
封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…...
【C语言】内存函数
大家好,很高兴又和大家见面了!!! 在C语言标准库中,有一些直接对内存进行操作的函数,我们将其称之为内存函数,这些函数位于头文件<string.h>,在网站https://cplusplus.com/ref…...
SDL视频显示函数
文章目录 1. **`SDL_Init()`**2. **`SDL_CreateWindow()`**3. **`SDL_CreateRenderer()`**4. **`SDL_CreateTexture()`**5. **`SDL_UpdateTexture()`**6. **`SDL_RenderCopy()`**7. **`SDL_RenderPresent()`**8. **`SDL_Delay()`**9. **`SDL_Quit()`**总结示例代码:代码说明:…...
博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具
这是一个使用 wxPython 构建界面、moviepy 处理视频的自定义 GUI 应用程序。该工具提供了视频播放、元数据提取、格式转换、视频裁剪和截图等功能。通过分析其设计和实现,我们将了解其工作原理、优点和潜在的改进空间。 C:\pythoncode\new\output\pymovieSample.py …...
Redis中AOF的实现方式和AOF重写
一、AOF 的实现方式 核心原理 AOF 通过将写操作命令以追加方式记录到日志文件中,重启时通过重放命令恢复数据。与 RDB 的快照机制不同,AOF 是增量记录,更适用于数据一致性要求较高的场景。写入流程 命令执行:客户端发送写命令&am…...
Supervisor的安装和使用
Supervisor 使用笔记(CentOS 8 环境) 本周,老师让我使用supervisor管理项目服务,当时第一次听说过这个进程管理工具😶🌫️,就上网搜了搜安装和使用,又用ai查了一些细节࿰…...
JVM 内存区域详解
JVM 内存区域详解 Java 虚拟机(JVM)的内存区域划分为多个部分,每个部分有特定的用途和管理机制。以下是 JVM 内存区域的核心组成及其功能: 一、运行时数据区(Runtime Data Areas) 1. 线程共享区域 内存…...
【java】在 Java 中,获取一个类的`Class`对象有多种方式
在 Java 中,获取一个类的Class对象有多种方式。Class对象代表了 Java 中的一个类或接口的运行时类信息,可以用于反射操作。以下是获取Class对象的几种常见方法: 1.使用.class属性 每个类都有一个.class属性,可以直接获取该类的Cl…...
蓝桥杯:对字符串处理常用知识笔记
一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码(常用) #include <iostream> #in…...
c++网络编程,信号透传可能是什么意思
在 C 网络编程中,**信号透传**(Signal Pass-Through)通常 refers to the concept of allowing signals to propagate through a network protocol stack without being interrupted or modified. 具体来说,信号透传可以涉及到几个…...
数据结构与算法学习笔记----贪心·绝对值不等式
数据结构与算法学习笔记----贪心绝对值不等式 author: 明月清了个风 first publish time: 2025.4.5 ps⭐️感觉其实是一个数学的问题, Acwing 104. 货仓选址 [原题链接](104. 货仓选址 - AcWing题库) 在一条数轴上有 N N N家商店,他们的坐标分别为 A…...
CUDA学习--体验GPU性能
学习来源:2 CUDA Python--并行计算基础-卷积计算以及共享内存_哔哩哔哩_bilibili 处理一张图片的处理速度对比 import cv2 from numba import cuda import time import math cuda.jit() def process_gpu(img,channels):tx cuda.blockIdx.x*cuda.blockDim.xcuda…...
博途 TIA Portal之1200做主站与200SMART的S7通讯
有时候,我们与之作S7通讯的西门子系PLC并不是同一个厂商或是同一时期供货的,也有可能不在一个编程软件中。此时进行S7能讯会有所不同。本文将演示博途与200SMART做S7通讯。 1、硬件准备 1200PLC一以,200SMART一台,网线2根,交换机一台。 2、关于编程 1200做主站,因此需…...
a标签download下载图片
a标签的download属性是HTML5中新增的一个属性,用于指定链接点击时直接下载文件,而不是在浏览器中打开文件。 基本用法 指定下载文件名:在a标签中添加download属性,并指定一个文件名。例如: <a href"…...
#SVA语法滴水穿石# (013)关于 disable iff、matched 、expect 的用法
SystemVerilog 断言(SVA)中 disable iff、matched 和 expect 的语法知识。 1. disable iff (condition) 功能与定义 作用:当指定条件(condition)为真时,禁用当前属性的检查。 常用于复位(rese…...
Day2-2:前端项目uniapp壁纸实战
再在wallpaper新建一个目录components 在components下新建组件common-title 记得点击创建同名目录 在index加 <view class"select"><common-title></common-title></view> 图片换了下,原来的有点丑,图片可按自己喜欢…...
pycharm如何通过跳板机连接服务器在本地debug
现在假设你有一个服务器,需要跳板机登陆,但是你从跳板机到服务器,只知道能直接通过ssh连接。 首先你可以现在本地创建一个 SSH 配置文件(~/.ssh/config): Host jumpHostName 跳板机地址Port 端口User 用户…...
Mysql explain中列的解析
EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys:查询可以利用的索引&#…...
场馆预定系统小程序PHP+uniapp
场馆预定系统小程序:基于PHPUniApp的多场景体育场馆智慧化解决方案 随着全民健身意识的提升,体育场馆的数字化管理需求日益增长。场馆预定系统小程序凭借其轻量化、高便捷性,成为体育馆、羽毛球馆、兵乒球馆等场所提升运营效率的核心工具。本…...
05.unity 游戏开发-3D工程的创建及使用方式和区别
05.unity 游戏开发-3D工程的创建及使用方式和区别 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ unity简介…...
php8 命名参数使用教程
简介 PHP 8 引入 命名参数(Named Arguments),允许在调用函数时按参数名传递值,而不是按照参数位置。这增强了代码的可读性、灵活性,并减少参数顺序依赖。 基本用法 传统位置参数(Positional Arguments&a…...
Transformer与注意力机制详解
1 Transformer与注意力机制详解 本文直观上详细介绍了大语言模型中十分重要的结构——Transformer,及其核心:注意力机制的原理。 1. Transformer结构 基础结构如下图所示,左侧由一系列Encoder block(编码器)构成,接收字词句输入;右侧由一系列Decoder block(解码器)…...
xLua环境控制+xLua的Lua调用C#的1
编写自定义加载器加载指定路径的Lua文件: using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using XLua;//Lua是脚本语言,编写代码脚本是实现功能最重要的方式 public class Loader : MonoBehaviour …...
RabbitMQ应用问题
RabbitMQ应用问题 一.幂等性1.简述概念2.MQ的幂等性介绍3.解决幂等性问题(1)全局唯一ID(2)业务逻辑判断 二.顺序性保障1.简单介绍2.无法保证顺序性的场景3.保障方案1)单队列消费者2)分区消费3)消息确认机制4)业务逻辑控制 三.消息积压问题1.原因分析2.解决方案 一.幂等性 1.简…...