Создание объектов Django с объектами в корзине S3 - PullRequest
0 голосов
/ 26 сентября 2019

Я загрузил большое количество изображений на S3, используя утилиту awcli.Я пытаюсь написать команду управления 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 голосов
/ 26 сентября 2019

Я сделал это с несколькими дополнительными шагами, но я также предположил, что, поскольку у нас есть объекты, хранящиеся в 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)


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...