可以把ForeignKey()的第1个参数设置为值 “self” 实际形成数据表记录的父子层次结构。
下面是一个简单的实例:
在文件 E:\Python_project\P_001\myshop-test\myshop\app1\models.py 中写入下面的代码:
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
启动数据库…
然后执行数据库迁移指令:
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 中写入下面的代码:
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中写入下面的代码:
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...')
然后运行,运行结果如下: