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

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

相关推荐
陈天伟教授3 小时前
人工智能训练师认证教程(2)Python os入门教程
前端·数据库·python
Elastic 中国社区官方博客4 小时前
Elasticsearch:在分析过程中对数字进行标准化
大数据·数据库·elasticsearch·搜索引擎·全文检索
聪明努力的积极向上4 小时前
【MYSQL】字符串拼接和参数化sql语句区别
数据库·sql·mysql
代码or搬砖4 小时前
RBAC(权限认证)小例子
java·数据库·spring boot
神仙别闹4 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
2301_768350234 小时前
MySQL为什么选择InnoDB作为存储引擎
java·数据库·mysql
上海蓝色星球4 小时前
迈向智慧电网新纪元:上海蓝色星球数字孪生变电主子站系统
运维·数据库
是大芒果4 小时前
数据库表设计
数据库
哥哥还在IT中4 小时前
MySQL order by 如何优化
数据库·mysql
积跬步,慕至千里5 小时前
postgre数据库大批量快速导出方法总结
数据库·postgres