使用S3存储桶中的对象创建Django对象

时间:2019-09-26 16:25:53

标签: django amazon-s3

我已经使用awcli实用程序将大量图像上传到S3。我正在尝试编写Django管理命令来遍历它们,并在数据库中为它们创建对象。

到目前为止,我已经能够获得该对象-但我仍在坚持做适当的Django对象的工作。

很明显,这段代码无法正常工作,但希望能对我正在尝试的工作有所启发。

s3 = boto3.resource('s3', region_name='us-east-2')
bucket = s3.Bucket('photo-uploads')
object = bucket.Object('00004542/000045420020.jpg')

photo = Photo.objects.create(title='Some title', image=object)
photo.save()

1 个答案:

答案 0 :(得分:0)

我通过一些额外的步骤完成了此操作,但我还假设由于我们将对象存储在s3中,因此我们也不想将它们也存储为BLOB。我只在给定资源上存储访问对象所需的所有引用:

这是您的型号:

3
{(1,): 1, (0,): 0, (2,): 1, (3,): 2, (4,): 3}
5

省略号是您放置主键汤匙(UUID,AutoField等)的地方

这样,我们可以确保我们拥有从存储桶中检索图像或使用对象键和存储桶信息为对象生成URL所需的所有信息。

您不需要在数据库中存储物理s3对象,因为您已经在s3中完成了此操作。

让我知道这是否有意义。

然后您将执行

class Resource(models.Model):
    ...
    region_name = models.CharField(max_length=32, default='us-east-2')
    bucket_name = models.CharField(max_length=32, default='photo-uploads')

class Photo(models.Model):
    ...
    title = models.CharField(max_length=56)
    object_key = models.CharField(max_length=128) # make this however big you need to fit your worst case object key string
    resource = models.ForeignKey(Resource, on_delete=models.DO_NOTHING)

然后,这使我们能够使用resource = Resource.objects.create(region_name='us-east-2', bucket_name='photo-uploads') photo = Photo.objects.create(title="Some title", object_key='00004542/000045420020.jpg', resource=resource) 模型从数据库中存储的信息中下载文件。

Photo