【发布时间】:2020-04-23 19:00:10
【问题描述】:
我为模型编写了一个自定义的delete 方法。它似乎有两个注意事项。
当我进入 Django Admin 中的模型实例并单击删除时,该文件将从 AWS S3 存储桶中删除(这是首先覆盖该方法的目的)。模型本身也会被移除。
如果我通过“删除所选”批量功能删除,则文件会在 S3 中逗留,但该实例会从该类型的实例列表中删除。
据我了解,在批量删除中,调用了不同的(查询集)方法。
我的问题是,使单次删除和批量删除的行为相同的最有效方法是什么?我应该尝试为此模型创建自定义管理器吗?
模型声明和删除方法:
from boto3.session import Session
from django.conf import settings
class Video(models.Model):
title=models.CharField(max_length=500)
description=models.TextField(default="")
creation_date=models.DateTimeField(default=timezone.now)
videofile=models.FileField(upload_to='videos/', null=True, verbose_name="")
tags = TaggableManager()
actions = ['delete']
def __str__(self):
return self.title + ": " + str(self.videofile)
def delete(self, *args, **kwargs):
session = Session (settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
s3_resource = session.resource('s3')
s3_bucket = s3_resource.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
file_path = "media/" + str(self.videofile)
response = s3_bucket.delete_objects(
Delete={
'Objects': [
{
'Key': file_path
}
]
})
print(file_path)
print(response)
super(Video, self).delete(*args, **kwargs)
【问题讨论】:
-
另外你不需要手动调用 s3 会话(如果你设置了存储后端) Filefield 有删除处理程序( self.videofile.delete() )
-
它应该按原样工作吗?就我而言,它将文件留在原地。
-
不,正如我在回答中已经说过的,您必须覆盖或创建自定义操作。我专门评论了使用您编写的 s3 代码,如果您使用适当的存储后端,可以用单行替换(与问题无关,而是与观察相关,所以为什么它是评论)
-
我该怎么做?我有一个存储后端,但它现在很空旷。
标签: django django-models django-queryset