我正在为应用程序建模文件夹结构。每个元素(文件夹或文件)都有自己的ID和其父ID:
class Folder(TimeStampedModel):
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
parent_folder = models.ForeignKey(
'folders.Folder',
on_delete=models.CASCADE,
null=True,
)
我想获取一个文件夹的所有嵌套子级。显然,可以通过递归查询“使用此parent_id查找所有对象”,然后对所有找到的对象进行递归调用来完成。但是我想知道Django是否有可能在一个查询中执行此操作,这样我就不必连接数据库X次,而只需连接一次。最好的方法是什么?
答案 0 :(得分:0)
我建议在模型中添加一个新字段:
class Folder(TimeStampedModel):
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
path = CharField(max_length=200)
parent_folder = models.ForeignKey(
'folders.Folder',
on_delete=models.CASCADE,
null=True,
)
例如,如果文件有一个parent_1,而parent_1有一个parent_2,则您的文件对象路径将另存为:
file.path = str(parent_2.id) + "/" + str(parent_1.id) + "/"
其中parent_2_id和parent_1_id分别是父级2和父级1的ID。
要查找parent_2中包含的所有文件,您将编写: parent_2_id = str(parent_2.id)
Folder.objects.get(path__contains='parent_2_id')
要保存新文件,您将需要保存在其中的文件夹的完整路径:
file.path = parent_folder.path
file.save()