如何删除FileField django中的PK和文件?

时间:2018-07-05 18:30:51

标签: django database models

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

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

1 个答案:

答案 0 :(得分:0)

好吧,您实际上无法从表中删除主键。 表按其行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')