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()
(URL、ファイルサイズなどを後で取得できるように、ファイルパスを Boto で処理する必要があるため、ファイルパスを文字列に変換することはできません。)
とにかく、Boto を回避するために、save() を次のようにオーバーライドしてみました。
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() を呼び出す方法がわかりません。明らかに...
...しかし、私の主な質問は、これがこのテーブルに書き込むときにストレージ エンジンをバイパスする正しい方法なのか、それともよりクリーンな方法があるのかということです。
ありがとう!