Как загрузить CSV-файл, созданный в Django, на AWS S3?

У меня есть модель Django, которая имеет поле FileField, файл должен быть сохранен в AWS S3.
models.py:

class Search(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='searches')
type = models.CharField(max_length=150)
keyword = models.CharField(max_length=150)
amount = models.IntegerField()
date = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=50)
results = models.FileField(blank=True, storage=PrivateMediaStorage())

Выгрузка на AWS S3 работает, когда я создаю новый объект в области администратора и загружаю туда файл. Однако я хочу создать CSV файл в бэкенде и загрузить его в S3 оттуда, не используя никакой формы.
Внутри функции бэкенда:

    with open(f'results{search_id}.csv', 'w', newline='') as f:
    writer = csv.writer(f)

    header = ['name', 'email', 'follower_count', 'play count', 'share count', 'comment count', 'has email']
    writer.writerow(header)

    for result in results:
        data = [result['author_name'], result['author_email'], result['follower_count'], result['play_count'], result['share_count'], result['comment_count'], result['has_email']]
        writer.writerow(data)

    # Updating database data
    search = Search.objects.get(id=search_id)

    search.status = 'Finished'
    search.results = ContentFile(f)
    search.save()

Однако сейчас это просто создает файл results.csv в моем каталоге Django и не загружает никакой файл на S3. Как я могу это исправить?

При вашем нынешнем подходе, я думаю, вам нужно сделать что-то подобное тому, что предлагается в этом посте.

Можно попробовать что-то вроде этого?

    # replace this line
    # search.results = ContentFile(f)
    search.results.save(new_name, ContentFile(f.read()))
    search.save()

Если вы хотите загрузить файл на s3 непосредственно из скрипта, вам нужно использовать boto3:

  1. Запустите сессию boto3
  2. Создайте объект для объекта s3
  3. Доступ к ведру в ресурсе s3
  4. Загрузите файл

Очевидно, что это сильно упрощено, но всю документацию можно найти здесь: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html

Вернуться на верх