首页 > 解决方案 > 如何在 FileField django 中删除 PK 和文件?

问题描述

我有modelform一个FileField,所以我只是为我的数据库添加了一些带有一些描述的文件。它在我定义的位置添加一个文件,MEDIA_ROOT并为每个项目添加一个 PK。例如,考虑我添加 5 个对象和 5 个文件。

我的问题是当我从shell或admin中删除所有5个对象时,相应的文件和PK不会被删除,而当我添加另一个对象时,PK从6开始。我怎样才能完全删除一个对象及其对应文件和 PK 并对其他对象进行排序,例如,如果我删除第 3 个对象,我希望第 4 个和第 5 个对象成为第 3 个和第 4 个。

标签: djangodatabasemodels

解决方案


好吧,您实际上不能从表中删除主键。表由它们的行 ID 索引。这意味着如果您删除一行,该行的 id 以后将无法使用。否则,每次删除一行时,都应该重新索引孔表,考虑到表中有多少行,这会花费大量时间和资源。

但无论如何你都可以做到。它的完成方式是您必须将另一列作为额外的 id 列并用它来索引表。此外,您必须在删除一行后更改所有 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')

推荐阅读