因为 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 处理 filepath,以便稍后可以获取它的 URL、文件大小等,所以我不能将 filepath 转换为字符串。
无论如何,我尝试像这样覆盖 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(),显然......
。但我的主要问题是,当我写入此表时,这是否是绕过存储引擎的正确方法,或者是否有更干净的方法来做到这一点。
谢谢!
django-storages等应用程序的自定义后端覆盖存储后端,http://django-storages.readthedocs.org/en/latest/index.html 该应用程序甚至在上传后支持Amazon S3,您可以轻松获取文件的URL