Прикрепление Django модели intstance для сохранения сельдерея - PullRequest
0 голосов
/ 06 марта 2020

Я использую S3 в качестве хранилища мультимедиа в Django. Дело в том, что если видео загружено, то ответ на просмотр занимает слишком много времени. Я знаю, что должен быть способ сделать это asyn c.

фрагмент view.py

with transaction.atomic():
    media = Media(
        med_user_id=account,
        med_path=file,
        med_thumbnail=thumbnail,
        med_assoc_data=data,
    )

   save_async.delay(media)

переменная файл is видео с этим классом <class 'django.core.files.uploadedfile.TemporaryUploadedFile'>

, когда я сохраняю это на media.save(), это занимает 12-20 секунд. Я думал создать задачу сельдерея, которая справится с этим.

@app.task(bind=True)
def save_async(self, instance):
    instance.save()

Я знаю, что это не имеет никакого смысла, потому что это выдает ошибку сериализации. Object of type Media is not JSON serializable так что вопрос в том. как мне сделать model.save() функцию асин c с сельдереем?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 марта 2020

Сельдерей не понимает такие объекты. Лучшее решение - отправить атрибуты объекта в save_asyn c. Да, вы потеряете обобщение вашего метода отложенного сохранения. Поэтому в этом случае вам необходимо сохранить ссылку в базе данных и отправить атрибуты с данными в метод задержки. Пример на вашем примере выглядит так:

в views.py

with transaction.atomic():
    media = Media(
       med_user_id=account,
       med_path=file,
       med_thumbnail=thumbnail,
       med_assoc_data=None,    # you can remove this or add a reference to ur S3 upload ID
   )

media.save()

save_async.delay(media.id, data)

в файле tasks.py

@app.task(bind=True)
def save_async(instance_id, data):
    media = Media.objects.get(pk=instance_id)
    media.data = data
    media.save()

Надеюсь, это поможет!

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