Как удалить PK и файл в FileField Django? - PullRequest
0 голосов
/ 05 июля 2018

У меня есть modelform с FileField, поэтому я просто добавляю несколько файлов с некоторыми описаниями для моей базы данных. Он добавляет файл в папку, которую я определил в MEDIA_ROOT, и добавляет PK для каждого элемента. Например, учтите, что я добавил 5 объектов с 5 файлами.

Моя проблема в том, что когда я удаляю все 5 объектов из оболочки или администратора, соответствующие файлы и ПК не удаляются, а когда я добавляю другой объект, ПК начинается с 6. Как я могу полностью удалить объект с соответствующим файлом и PK и отсортировать остальные, например, если я удаляю 3-й объект, я хочу, чтобы 4-й и 5-й объекты стали 3-м и 4-м.

1 Ответ

0 голосов
/ 06 июля 2018

Ну, вы на самом деле не можете удалить первичный ключ из ваших таблиц. Таблицы индексируются по их идентификаторам строк. Это означает, что если вы удалите строку, идентификатор этой строки будет недоступен для использования в дальнейшем. В противном случае каждый раз, когда строка удаляется, таблицу дырок необходимо переиндексировать, что отнимает много времени и ресурсов, учитывая количество строк в вашей таблице.

Но ты все равно можешь это сделать. Это делается так, что вам нужно сделать еще один столбец в качестве дополнительного столбца id и индексировать таблицу с ним. Также вы должны изменить все идентификаторы после удаления строки. Я настоятельно рекомендую вам не делать этого, потому что я не понимаю, как вы можете извлечь выгоду из такой архитектуры для вашей базы данных.

А для удаления файла при удалении строки:

@receiver(pre_delete, sender=YourModel)
def file_delete(sender, instance, **kwargs):
    if instance.YOUR_FILE_FIELD_NAME: 
        instance.YOUR_FILE_FIELD_NAME.delete()

Он удалит сохраненный файл каждый раз, когда вы удаляете строку из любого места.

Или вот так:

os.remove('file/path')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...