Извлечение всех объектов, иерархически вложенных ForeignKey в одном запросе - PullRequest
0 голосов
/ 06 февраля 2019

Я моделирую структуру папок в моем приложении.Каждый элемент (папка или файл) имеет свой собственный идентификатор и идентификатор своего родителя:

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 голосов
/ 06 февраля 2019

Я предлагаю добавить новое поле в модель:

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.

Чтобы найти все файлы, включенные в parent_2, напишите: parent_2_id = str (parent_2.id)

Folder.objects.get(path__contains='parent_2_id')

Для сохранения нового файла вам понадобится полный путь к папке, в которой вы сохраните:

file.path = parent_folder.path 
file.save()
...