【问题标题】:django storages aws s3 delete file from model recorddjango storages aws s3 从模型记录中删除文件
【发布时间】:2017-11-19 13:04:18
【问题描述】:

我的 django aws S3 解决方案基于 https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

现在我正在尝试找到一种方法来删除包含 S3 文件的模型中的一行。我可以使用 .delete() 删除该行,但它不会在 S3 中删除。

如何使删除行在 S3 中也删除?

下面是我的代码:

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/api.py

@api_view(['POST'])
def delete_employee(request):
    # ----- YAML below for Swagger -----
    """
    description: This API deletes employee
    parameters:
      - name: employee_id
        type: integer
        required: true
        location: form
    """
    employee_id = request.POST['employee_id']
    employee = Employee.objects.get(id = employee_id)
    logging.debug(f"API employee username {employee.username}")
    employee.delete() <---------- here is where the delete row happens
    return Response("Employee Deleted!", status=status.HTTP_200_OK)

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/models.py

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee')
    company = models.ForeignKey(Company)
    username = models.CharField(max_length=30, blank=False)
    upload = models.FileField(blank=True) <--- S3 field

https://gitlab.com/firdausmah/railercom/blob/master/railercom/settings.py(AWS 设置)

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

DEFAULT_FILE_STORAGE = 'railercomapp.storage_backends.MediaStorage'

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/storage_backends.py 从 storages.backends.s3boto3 导入 S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    location = 'media/yy'
    file_overwrite = False

【问题讨论】:

    标签: django amazon-web-services amazon-s3 delete-row django-storage


    【解决方案1】:

    您必须明确删除该文件。您可以编写 post delete signal 或在 delete_employee 函数中执行。

    employee.upload.delete(save=False)  # delete file
    employee.delete()  # delete model instance
    

    FileField.delete() 的文档对此进行了解释。

    请注意,删除模型时,不会删除相关文件。如果您需要清理孤立文件,则需要自己处理(例如,使用可以手动运行或计划通过例如 cron 定期运行的自定义管理命令)。

    您还应该确保在删除之前没有其他 FileField 引用完全相同的文件。

    【讨论】:

    • 谢谢,你拯救了我的编程生涯
    【解决方案2】:

    我用过这个:

    import boto3
    
    client = boto3.client('s3')
    client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
    

    但我正在尝试找到一种方法来使用我的模型的 ImageFile 对象,或者可能使用我的存储类的一些配置:

    from storages.backends.s3boto3 import S3Boto3Storage 
    
    class MediaStorage(S3Boto3Storage):    
        location = 'media'    
        file_overwrite = True
    

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多