在一个查询中获取由ForeignKey分层嵌套的所有对象

时间:2019-02-06 14:46:45

标签: python django recursion nested foreign-keys

我正在为应用程序建模文件夹结构。每个元素(文件夹或文件)都有自己的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次,而只需连接一次。最好的方法是什么?

1 个答案:

答案 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()