Django: Как манипулировать объектом Model перед добавлением его в БД? - PullRequest
1 голос
/ 14 января 2011

В Python-Django у меня есть модель с элементом FileField.Этот участник хранит видеофайлы.

Я бы хотел "вмешаться" в стандартную процедуру добавления модели / объекта / экземпляра "Django" и манипулировать каждым видео, которое я добавляю, перед тем как совершение или добавление его в базу данных.

Манипуляция заключается в преобразовании видео в определенный унифицированный формат.Таким образом, все добавленные видео будут в конечном итоге сохранены в одном и том же формате ( WebM ).

Как я могу это сделать?Я просмотрел пользовательских менеджеров Django , но не думаю, что это то, что я ищу.

Спасибо.:)

Ответы [ 4 ]

5 голосов
/ 14 января 2011

Вы можете переопределить save() или использовать сигналы .

Однако преобразование видео займет много времени. Возможно, не стоит делать это синхронно в вашем веб-запросе. Распространенным подходом является выгрузка работы в очередь задач. Посмотрите на Сельдерей для этого.

3 голосов
/ 14 января 2011

Я на самом деле делаю то же самое.Вы не хотите обрабатывать видеофайл по тому же запросу, по которому он поступил, по нескольким причинам:

1) Пользователь будет долго висеть на неотвечающей странице, возможно, синхронизируя ихи интересно, сработало ли это.2) И если они посмотрят, загружен ли он - он все еще не завершен и не сохранен в БД (несовместимый), они подумают, что он поврежден.

Вы хотите сначала сохранить запись ифайл на вашем сервере.Пометьте его как надобный.И запустите задачу сельдерея, которая выполнит эту работу, и обновите этот флаг, когда она будет выполнена.На самом деле я делаю то же самое с zencoder для проекта, над которым я сейчас работаю.Прекрасно работает.

Сельдерей: http://pypi.python.org/pypi/django-celery Гетток (для местных): http://pypi.python.org/pypi/ghettoq

3 голосов
/ 14 января 2011

Или вы можете использовать сигналы django для запуска событий, когда элементы собираются или были сохранены в базе данных.

В частности, вы используете метод Signal.connect () для подключения обработчика сигнала, который вы хотите запустить, например pre_save, post_save, pre_delete, post_deleteи т. д.

Для настройки:

signal.py :

from django.db.models.signals import *

def entry_action_post_save(sender, instance, **kwargs):
    # what do we want to do here?
    pass

post_save.connect    (entry_action_post_save,        sender=Entry)

Где для меня Entry это models.Model производный класс.

В этом блоге также рассматривается альтернативный способ его настройки с помощью диспетчера в models.py .

Обратите внимание, что поскольку вы рассматриваете кодирование видеоздесь вы, возможно, не захотите перекодировать видео внутри этих методов, иначе ваш запрос будет длиться вечно.Лучшим способом было бы проверить кодировку, и иметь модель с полем status для webM или notwebm.Затем передайте свою задачу кодирования в другом месте и не отображайте видео (Videos.objects.filter(format='webm'), пока оно не будет завершено.

2 голосов
/ 14 января 2011

Вы можете просто переопределить метод save() в вашей модели. См. документацию .

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