2012-02-03 3 views
2

django 응용 프로그램에 몇 가지 추가 기능이 추가되어 결과적으로 upload_to 기능도 확장되었습니다.django FileField 파일의 이름 바꾸기

django는 기본적으로 데이터베이스의 파일 이름과 디스크의 파일을 저장하므로 해를 끼치 지 않았습니다. 새 파일은 새로운 upload_to 함수를 사용하여 이름이 지정되고 이전 파일은 계속 작동합니다.

그러나,이 지저분 - 우리가

/media/userID/oldfilename.pdf 

/media/app/userID/projectID/newfilename.pdf 

같은 파일이있는 상황에서 결국 거기 일괄하는 방법은 해당 파일의 이름을 변경? 데이터베이스를 반복하면서 FileField의 경로가 현재 upload_to의 결과와 일치하는지 확인하고, 그렇지 않은 경우 이름을 바꾸면됩니다. 일반적인 문제인 것처럼 보입니다. 따라서 더 일반적인 방법이있을 것입니다.

+0

나는 스크립트를 직접 작성 포함하지 않는이 일을 어떤 식 으로든 잘 모르는 것 같아요. –

답변

1

간단한 해결책은 사용자 정의 Django management command을 작성하는 것입니다. Django의 표준 manage.py을 사용하여 명령을 실행할 수 있습니다. 이 같은

뭔가 :

from django.core.management.base import BaseCommand, CommandError 
from example.models import YourModel 

class Command(BaseCommand): 
    args = '' 
    help = '' 

    def handle(self, *args, **options): 

     # Get all objects 
     objects = YourModel.objects.all() 

     for object in objects: # For each object 

      # If old file path: 
      if not 'userID/projectID' in objects.filefield.name: 
       # Move the file, eg usign shutil http://docs.python.org/library/shutil.html#shutil.move 
       # Update filefield 
       # save object 
+0

그래, 내가 '데이터베이스를 통한 바보 루프'라고 말했던 것입니다. 합리적인 방법이 있는지 궁금합니다. 아마도 모델의 .save() 메소드에 포함 시켰을 것입니다. 자주 액세스하는 모델에 대해 온라인으로 작업을 수행하십시오. – qdot

+1

'벙어리 루프'는 문제를 한 번에 해결할 수있는 깨끗한 솔루션 인 것 같습니다. 덮어 쓰기 저장은 '엉망'을 줄입니다. –

+0

그냥 호기심. 이 작업이 한 번만 실행되도록 의도 된 경우 데이터 마이그레이션으로 구현하는 것이 더 좋지 않겠지 만 향후에 파일 경로/명명 스키마를 변경하는 경우 위와 같이 mgmt cmd로 변경하십시오. – ckot

관련 문제