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

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

相关推荐
菜鸟小九5 分钟前
mysql运维(日志)
运维·数据库·mysql
SelectDB34 分钟前
Apache Doris 实时更新全解:从设计原理到最佳实践|Deep Dive
数据库·apache
纪莫40 分钟前
技术面:如何解决缓存和数据库一致性的问题?
数据库·redis·java面试⑧股
番茄你个西红41 小时前
安装KingbaseES时服务器swap的设置
linux·数据库
是一个Bug1 小时前
Spring事件监听器源码深度解析
java·数据库·spring
Wang's Blog1 小时前
MongoDB小课堂: 分片集群架构深度解析与生产级优化指南
数据库·mongodb·架构
万邦科技Lafite1 小时前
API接口地址解析地区码操作指南
网络·数据库·redis·缓存·开放api·电商开放平台
此生只爱蛋1 小时前
【Redis】常用命令
数据库·redis·缓存
Zsr10232 小时前
MySQL 主从同步与读写分离:构建高性能、高可用数据库架构
数据库·mysql
老华带你飞2 小时前
房屋租赁管理|基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·毕设