Я сделал это с несколькими дополнительными шагами, но я также предположил, что, поскольку у нас есть объекты, хранящиеся в s3, мы не хотим также сохранять их как BLOB в базе данных.Я храню только все ссылки, которые нам нужны для доступа к объекту на данном ресурсе:
вот ваши модели:
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)
Эллипсы - это то место, куда вы положили бы свой первичный ключ супаde jour (UUID, AutoField и т. д.)
Таким образом мы можем гарантировать, что у нас есть вся информация, необходимая для извлечения изображения из корзины или создания URL-адреса для объекта с ключом объекта и информацией о корзине.
Вам не нужно хранить физический объект s3 в вашей базе данных, поскольку вы уже делаете это в s3.
Дайте мне знать, если это имеет смысл.
Тогда высделает это
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
.
import boto3
from .models import Photo
# get the first one since in my example we only have one, but you would use the Photo id for other usecases
photo = Photo.objects.first()
s3 = boto3.resource('s3', region_name=photo.resource.region_name)
bucket = s3.Bucket(photo.resource.bucket_name)
object = bucket.Object(photo.object_key)