覆盖由Boto-Django处理的FileField的Model.save()

时间:2012-07-04 14:38:20

标签: django django-models boto

因为Heroku在30秒后超时,我必须将用户提交的文件直接上传到S3。将它们上传到S3后,我在数据库中插入一个条目来记录我收到的这个文件。这是我的模特:

class UserUploadedFile(models.Model):
    id = models.AutoField(primary_key=True)
    uid = models.ForeignKey('auth.user', editable=False, db_column='uid')
    filepath = models.FileField(storage=S3BotoStorage(bucket='whatever'), upload_to='/')

但是因为Boto是自动调用的,当我这样调用save()时,会调用Boto来处理该文件:

file = UserUploadedFile(uid=request.user, filepath=key)
file.save() 

(我确实需要文件路径由Boto处理,所以我可以获得它的URL,文件大小,以及稍后,因此我无法将文件路径转换为字符串。)

无论如何,我试图像这样覆盖save()来绕过Boto:

def save(self, *args, **kwargs):
    filepath = self.filepath
    if self.filepath:
        self.filepath = ''
    super(UserUploadedFile, self).save(*args, **kwargs)
    self.raw('UPDATE mysite_useruploadedfile SET filepath=%s WHERE id=%d', [filepath, self.pk])

但是我收到了这个错误:

'UserUploadedFile' object has no attribute 'raw'

我不确定如何在这种情况下调用raw(),显然......

...但是我的主要问题是,当我写这个表时,这是否是绕过存储引擎的正确方法,或者是否有更简洁的方法

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用自定义后端覆盖存储后端,其中包含django-storages {{s3}}这样的应用,即使支持亚马逊s3,您也可以轻松获取该文件的网址