4

私は次のモデルを持っていFileFieldます:

class FileModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=200)
    file = models.FileField(upload_to='myfiles')

でモデル インスタンスを削除するとFileField、django は基になるファイルをファイル システムから自動的に削除しないため、基になるファイルを削除するシグナルを に設定しましたpost_delete

def on_delete(sender, instance, **kwargs):
    instance.file.delete()

models.signals.post_delete.connect(on_delete, sender=FileModel)

問題は、FileModelオブジェクトを削除すると (たとえば、django 管理ページから)、ファイル システムからファイルが削除されますが、モデルは削除されないことです。もう一度削除すると、モデルは削除されますが、ファイルが存在しないため、ファイルシステムからファイルを削除しようとすると例外が発生します。

ファイルの削除が発生するように変更すると、本来pre_deleteの動作ではなくpost_delete動作します。この動作の原因と考えられる唯一のことは、 からファイルを削除するとFileFieldモデルが自動的に保存され、 で再作成される場合post_deleteです。

だから私の質問は:FileFieldの delete メソッドを呼び出すとpost_delete、モデルが削除されないのはなぜですか?

4

2 に答える 2

6

FileField属性にアクセスすると、FieldFileラッパー インスタンスが取得されます。そのメソッドのコードが何であるかを推測してください.delete...( django.db.models.fields.files からリッピング)

def delete(self, save=True):
        # Only close the file if it's already open, which we know by the
        # presence of self._file
        if hasattr(self, '_file'):
            self.close()
            del self.file

        self.storage.delete(self.name)

        self.name = None
        setattr(self.instance, self.field.name, self.name)

        # Delete the filesize cache
        if hasattr(self, '_size'):
            del self._size
        self._committed = False

        if save:
            self.instance.save()

だからあなたは正しかった:)

私が正しく読んでいれば、もう一度post_deleteシグナルに接続save=Falseして削除メソッドを渡すことができ、動作するはずです。

はい、あなたの質問のために調べました。

于 2012-05-05T01:04:12.060 に答える
1

django-cleanupを試してください。モデル インスタンスの削除時に古いファイルが削除され、FileField または ImageField に新しいファイルをアップロードするときに古いファイルが削除されます。

于 2012-08-21T15:57:46.370 に答える