2011-01-14 3 views
1

Python-Django에서 FileField 멤버가있는 Model이 있습니다. 이 회원은 비디오 파일을 저장합니다.Django : DB에 추가하기 전에 Model 객체를 조작하는 방법은 무엇입니까?

Django의 표준 "add model row/object/instance"proecdure에 "간섭"하고 이 위임하거나 데이터베이스에 추가하기 전에 실제로 추가 할 각 비디오를 조작하고 싶습니다.

조작은 비디오를 특정 유니폼 형식으로 변환하는 것입니다. 따라서 추가 된 모든 비디오는 결국 동일한 형식 (WebM)으로 저장됩니다.

어떻게하면됩니까? 장고의 사용자 지정 관리자을 살펴 봤지만 내가 찾고있는 것은 아닌 것 같습니다.

감사합니다. :)

답변

3

나는 실제로 이것을 매우 똑같이하고 있습니다. 다음과 같은 이유로 인해 동일한 요청으로 동영상 파일을 처리하고 싶지는 않습니다.

1) 사용자는 응답이없는 페이지에 오랫동안 응답하지 않을 수 있습니다. 그것이 효과가 있는지 궁금해. 2) 그리고 그들이 업로드되었는지 확인하기 위해 - 아직 완료되지 않았으며 DB에 저장되어 있습니다 (일관성이 없음).

서버에 레코드 및 파일을 처음으로 저장하려고합니다. 작업 필요 사항으로 표시하십시오. 그리고 그 작업을 완료하고 플래그가 완료되면 업데이트 할 샐러리 작업을 시작하십시오. 나는 실제로 지금 작업하고있는 프로젝트에 대해 zencoder를 사용하여이 똑같은 작업을 수행하고 있습니다. 그것은 훌륭하게 작동합니다.

셀러리 (로컬 대) http://pypi.python.org/pypi/django-celery Ghettoq : http://pypi.python.org/pypi/ghettoq

2

모델의 save() 메소드를 무시할 수 있습니다. the documentation을 참조하십시오.

3

또는 django signals을 사용하면 항목을 데이터베이스에 저장하려고하거나 데이터베이스에 저장하려고 할 때 이벤트를 트리거 할 수 있습니다.

신호 :

은 특히, 일을 설정하기 위해, 예를 pre_save, post_save, pre_delete, post_delete

들어, 실행하고자하는 신호 처리기를 연결 Signal.connect() 방법을 사용한다. 평 :

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는입니다파생 클래스입니다.

이 블로그에서는 dispatcher in models.py을 사용하여 설정하는 다른 방법에 대해서도 다룹니다.

여기에서 비디오 인코딩을 고려 중이므로 실제로 이러한 방법으로 비디오를 다시 인코딩하지 않을 수도 있습니다. 그렇지 않으면 요청이 완전히 완료 될 것입니다. 더 나은 방법은 인코딩을 확인하고 모델에 webM 또는 notwebmstatus 필드를 사용하는 것입니다. 그런 다음 인코딩 작업을 다른 곳으로 전달하고 비디오가 완료 될 때까지 비디오 (Videos.objects.filter(format='webm')를 표시하지 마십시오.

+0

+1 신호 셀러리 신호 –

5

save()을 무시하거나 signals을 사용할 수 있습니다.

그러나 비디오를 변환하는 데는 많은 시간이 걸립니다. 아마도 웹 요청에서 동 기적으로 그렇게하는 것이 좋지 않을 것입니다. 일반적인 접근 방법은 작업을 작업 대기열로 오프로드하는 것입니다. 그것에 대해 Celery을보십시오.

+0

+1에 정교 해 주셔서. –

관련 문제