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

django 一个表中包括id和parentid,如何通过parentid找到全部父爷id

在Django中,如果你想要通过parentid找到一个记录的所有祖先(父祖)记录的id,你可以通过递归查询来实现。在Django中,你可以使用Django的Treebeard库来处理树形结构的数据,例如MPTT(Modified Preorder Tree Traversal)。但是,如果你不想使用第三方库或者你的需求比较简单,你可以通过编写递归查询函数来实现。

这里有两种常见的方法来实现:

方法1:使用Django的QuerySet的annotate和Subquery
这种方法适用于Django 2.0及以上版本。

from django.db.models import Subquery, OuterRef, IntegerField

def get_all_ancestors_ids(instance):
# 首先找到所有祖先的id
ancestors_ids = YourModel.objects.filter(
id=OuterRef(‘parentid’)
).values(‘id’)

# 通过Subquery获取所有祖先的id
all_ancestors_ids = YourModel.objects.filter(id=instance.id
).annotate(all_ancestors_ids=Subquery(ancestors_ids.values('id')[:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id'][:'id']  # 这里理论上应该有无限层级的递归查询,但实际上你需要根据实际层级来调整,例如最多10层)
).values_list('all_ancestors_ids', flat=True)return list(all_ancestors_ids)

注意:这种方法理论上可以实现无限层级的递归查询,但实际上你需要手动指定层级数(例如上面代码中的层级数仅为示例,你需要根据实际情况调整)。这种方法在层级非常深的情况下可能不实用。

方法2:递归函数查询
对于简单的应用场景,你可以定义一个递归函数来手动查找所有祖先。

def get_all_ancestors(instance):
ancestors = []
current = instance
while current.parentid is not None:
current = YourModel.objects.get(id=current.parentid)
ancestors.append(current.id)
return ancestors[::-1] # 返回时反转列表以获得正确的顺序(从祖先到子孙)
使用这个函数,你可以像这样调用它:

instance = YourModel.objects.get(id=some_id)
ancestors = get_all_ancestors(instance)
print(ancestors)
方法3:使用MPTT库(推荐对于复杂树形结构)
如果你需要处理更复杂的树形结构(例如,需要频繁查询祖先节点等),建议使用MPTT库。首先安装MPTT:

pip install django-mptt
然后在你的模型中使用MPTT:

from mptt.models import MPTTModel, TreeForeignKey
from django.db import models

class Category(MPTTModel):
name = models.CharField(max_length=50)
parent = TreeForeignKey(‘self’, on_delete=models.CASCADE, null=True, blank=True, related_name=‘children’)

def get_ancestors(self, ascending=False, include_self=False):ancestors = self.get_cached_ancestors(ascending=ascending, include_self=include_self)return [a.id for a in ancestors]  # 获取所有祖先的ID列表

使用:

instance = Category.objects.get(id=some_id)
ancestors_ids = instance.get_ancestors(include_self=False) # 获取所有父祖ID,不包括自身
print(ancestors_ids)
MPTT提供了非常强大的树形结构操作能力,包括但不限于获取祖先、子孙等。如果你预计会有很多复杂的树形操作需求,使用MPTT会是更好的选择。

http://www.lryc.cn/news/583054.html

相关文章:

  • react+ts 移动端页面分页,触底加载下一页
  • 板凳-------Mysql cookbook学习 (十一--------6)
  • 安卓设备信息查看器 - 源码编译
  • Android-重学kotlin(协程源码第二阶段)新学习总结
  • 中望CAD2026亮点速递(5):【相似查找】高效自动化识别定位
  • uniapp AndroidiOS 定位权限检查
  • Android ViewModel机制与底层原理详解
  • upload-labs靶场通关详解:第19关 条件竞争(二)
  • 池化思想-Mysql异步连接池
  • 5.注册中心横向对比:Nacos vs Eureka vs Consul —— 深度解析与科学选型指南
  • Web 前端框架选型:React、Vue 和 Angular 的对比与实践
  • 华为静态路由配置
  • 小米路由器3C刷OpenWrt,更换系统/变砖恢复 指南
  • 语音识别核心模型的数学原理和公式
  • 从互联网电脑迁移Dify到内网部署Dify方法记录
  • 【编程史】IDE 是谁发明的?从 punch cards 到 VS Code
  • 计算机网络实验——访问H3C网络设备
  • Java项目集成Log4j2全攻略
  • Using Spring for Apache Pulsar:Publishing and Consuming Partitioned Topics
  • 飞算 JavaAI 智能编程助手 - 重塑编程新模态
  • bash 判断 /opt/wslibs-cuda11.8 是否为软连接, 如果是,获取连接目的目录并自动创建
  • (C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • `fatal: bad config value for ‘color.ui‘`错误解决方案
  • ali linux 安装libreoffice
  • Markdown入门
  • 类和对象拓展——日期类
  • Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证
  • npu-smi info 华为昇腾NPU 状态监控工具解读
  • 类与对象【下篇】-- 关于类的其它语法
  • 树莓派vsftpd文件传输服务器的配置方法