python - 获取表中记录的所有 parent / child

标签 python sql django

我有一个名为“Items”的 SQL (Postgres) 表,具有以下架构。

id | parent_id | name

其中 parent_id 列是同一表的外键。 (例如,项目具有父项目,并且这些项目可以具有父项目)

这形成了一个简单的分支层次结构。

目前,我查询特定记录并使用 for 循环 来获取其每个父项/子项。 这会导致执行大量查询。

我想要做的是使用其中一项的 id 查询此表,并使用单个查询返回其所有父项/子项。

我可以通过对子项使用 .select_lated(“parent__parent”).prefetch_lated(“item_set”) 来完成此操作,但这两种方法都需要了解事先确定层次结构的深度。

Django 中有没有办法在单个查询中获取所有相关行? 原始 SQL 也很好。

最佳答案

这是一个用于获取记录的父级和子级层次结构的递归解决方案。

select * from 
(WITH RECURSIVE cte_items (id, name, parent_id) AS (
    SELECT id, name, parent_id        
    FROM items
    WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.parent_id
    FROM items e
      INNER JOIN cte_items o ON o.id = e.parent_id)
SELECT id, name, parent_id FROM cte_items) child
union
select * from 
(WITH RECURSIVE cte_items (id, name, parent_id) AS (
    SELECT id, name, parent_id        
    FROM items
    WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.parent_id
    FROM items e
      INNER JOIN cte_items o ON o.parent_id = e.id)
SELECT id, name, parent_id FROM cte_items) parent
order by parent_id
<小时/>

关于python - 获取表中记录的所有 parent / child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60350456/

相关文章:

python - sklearn 代码在笔记本电脑和台式机之间运行行为的变化

python - Django Twitter 克隆。如何限制用户多次点赞一条推文?

PHP MySQLI 准备语句在执行时返回 false

sql - 如何将 accdb 转换为 postgres 数据库

python - Django 如何在登录时只显示用户自己的帖子?

python - 使用python转换为json结果后的混淆矩阵格式

python - 如何打印元素在 Python 列表中出现的次数?

php - 将两个 mysql 查询合并为一个

python - Django:在几个文件中拆分forms.py

Django:如何从 urls.py.. 中的同一文件添加其他 url 模式?