使用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...')

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

相关推荐
m0_64030930几秒前
如何大幅提升 Google Sheets 数据库更新脚本的执行效率
jvm·数据库·python
杨浦老苏几秒前
开源数据库备份工具Databasus
数据库·docker·备份·群晖
Greyson11 分钟前
CSS如何实现单选按钮自定义样式_利用伪元素隐藏默认UI
jvm·数据库·python
2401_835956813 分钟前
Go语言怎么防SQL注入_Go语言SQL注入防护教程【深入】
jvm·数据库·python
杨云龙UP3 分钟前
CentOS7.9及以上环境部署TDengine TSDB-OSS实战指南:安装、配置、建库、建超级表与验证_20250418
大数据·linux·运维·数据库·centos·时序数据库·tdengine
m0_514520575 分钟前
宝塔面板怎样实现数据库的多地异地自动备份_结合阿里云OSS与定时任务插件
jvm·数据库·python
北漂Zachary5 分钟前
四大编程语言终极对决
java·linux·数据库
qq_334563556 分钟前
golang如何优化磁盘IO性能_golang磁盘IO性能优化思路
jvm·数据库·python
Aloudata9 分钟前
基于 NoETL 语义编织技术构建 AI-Ready 数据底座
数据库·人工智能·数据分析·skill·语义编织
主角1 713 分钟前
NoSQL之Redia配置与优化
数据库·nosql