使用Django数据库模型中的ForeignKey()形成数据表记录的父子层次结构

可以把ForeignKey()的第1个参数设置为值 "self" 实际形成数据表记录的父子层次结构。

下面是一个简单的实例:

在文件 E:\Python_project\P_001\myshop-test\myshop\app1\models.py 中写入下面的代码:

python 复制代码
from django.db import models

# Create your models here.


class Folder(models.Model):
    name = models.CharField(max_length=50)
    parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.DO_NOTHING, related_name="sub_folders")

    def __str__(self):
        return self.name

启动数据库...

然后执行数据库迁移指令:

bash 复制代码
CD E:\Python_project\P_001\myshop-test\myshop
E:
python manage.py makemigrations
python manage.py migrate

接下来在文件 E:\Python_project\P_001\myshop-test\myshop\sql_test_4.py 中写入下面的代码:

python 复制代码
import os
import django

# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')

# 加载Django的设置
django.setup()

# 导入模型
from app1.models import Folder

# 创建顶级数据表记录
folder1 = Folder.objects.create(name='Folder 1')

# 创建子数据表记录
sub_folder1 = Folder.objects.create(name='Sub Folder 1', parent=folder1)
sub_folder2 = Folder.objects.create(name='Sub Folder 2', parent=folder1)

# 创建更深层次的子数据表记录
sub_sub_folder = Folder.objects.create(name='Sub Sub Folder', parent=sub_folder1)

运行sql_test_4.py后,数据库表的记录如下:

从上面的数据库表记录的id和parent_id其实已经可以看出结构关系了。

接下来,在文件E:\Python_project\P_001\myshop-test\myshop\sql_test_5.py中写入下面的代码:

python 复制代码
import os
import django

# 设置Dango运行时需要的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')

# 加载Django的设置
django.setup()

# 导入模型
from app1.models import Folder

# 获取最深层的数据表记录
folder = Folder.objects.get(name='Sub Sub Folder')
print("最深层的数据表记录的name为:", end='')
print(folder)
print('\n')

# 获取最深层的数据表记录的上一层父级数据表记录
parent_folder = folder.parent
print("Sub Sub Folder的上一层父级数据表记录的name为:", end='')
print(parent_folder)
print('\n')

# 获取最深层的数据表记录的上一层的上一层父级数据表记录
parent_parent_folder = parent_folder.parent
print("Sub Sub Folder的上一层的上一层的父级数据表记录的name为:", end='')
print(parent_parent_folder)
print('\n')

input('Press Enter to exit...')

然后运行,运行结果如下:

相关推荐
DevOpenClub6 分钟前
网页采集如何稳定输出结构化数据:JSON、链接与快照三阶段流水线
数据库·json·api
其实防守也摸鱼34 分钟前
免杀与持久化入门:从载荷免杀到隐蔽通道的完整指南
运维·服务器·数据库·安全·github·copilot·渗透
SelectDB34 分钟前
统一全文检索与 SQL 分析:Apache Doris 日志分析实践
运维·数据库·掘金技术征文
麻瓜code44 分钟前
【MySQL】SQL优化实战:从慢查询定位到查询改写
数据库·sql·mysql
蓝鸟19741 小时前
Oracle HIS业务视图优化实战|VI_BQ_YWTX11从高耗费到秒级响应
数据库·oracle·his数据库调优·复合索引踩坑·is null索引问题·ql视图优化
数智启示录2 小时前
Apache Doris 4.0.8 混合检索实战(第 5 篇):三套系统只返回两条结果,一条 SQL 如何避开交集丢失
大数据·数据库·经验分享·sql·面试
今天AI了吗2 小时前
大模型技术全景(一):AI、机器学习、深度学习,三者的关系到底是什么?一文搞懂
数据库·人工智能·python·sql·深度学习·机器学习·rust
这个DBA有点耶2 小时前
RANGE/LIST/HASH/二级分区怎么选?分区表适用边界与隐藏代价
数据库·mysql·dba
离陌在学C#2 小时前
C# 异步编程:从 async/await 到 Task 实战指南
开发语言·数据库·c#
2601_962074683 小时前
Spring Boot的无缝衔接:深入解析与实践
数据库·spring boot·后端