【问题标题】:Override Model.save() for FileField handled by Boto -- Django为 Boto 处理的 FileField 覆盖 Model.save() - Django
【发布时间】:2012-07-05 01:57:31
【问题描述】:

因为 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(),显然......

...但是我的主要问题是,当我写入此表时,这是否是绕过存储引擎的正确方法,或者是否有更清洁的方法。。 p>

谢谢!

【问题讨论】:

    标签: django django-models boto


    【解决方案1】:

    您可以使用 django-storages http://django-storages.readthedocs.org/en/latest/index.html 之类的应用程序使用自定义后端覆盖存储后端,该应用程序甚至支持亚马逊 s3,一旦上传,您就可以轻松获取文件的 url

    【讨论】:

    • 是否可以在没有 Boto 的情况下使用 django-storages?我认为 Boto 是 django-storages 如何处理 S3 后端的?我目前都在使用。 (抱歉回复晚了——我没有看到这方面的通知。)
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 2022-12-09
    • 2011-07-24
    • 1970-01-01
    • 2011-04-17
    • 2013-03-15
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多