Django에서 File 경로 설정

DARTZ·2023년 4월 25일
0

Projects

목록 보기
5/5

서론

Django에서 File을 저장했던 방법에 대해서 정리합니다. 저는 Excel File을 업로드 했고 파일 이름은 중복되지 않게 변환해서 저장했습니다. 그리고 모델이 삭제되면 자동으로 파일이 삭제되게 했습니다.

목록

  • 작성한 코드
  • 코드 설명

본론

# models.py
from django.db import models
import os
from uuid import uuid4
from django.utils import timezone
from django.db.models.signals import post_delete
from django.dispatch import receiver

from apps.users.models import User


# 업로드 파일을 고유의 이름으로 지정하기 위한 함수
def dateUploadTo(instance, filename):
    # upload_to="%Y/%m/%d" 처럼 날짜로 세분화합니다.
    ymd_path = timezone.now().strftime("%Y/%m/%d")
    # 길이 32 인 uuid 값을 만듭니다.
    uuid_name = uuid4().hex
    # 확장자 추출 os.path.splitext는 파일 확장자를 알려줍니다.
    extension = os.path.splitext(filename)[-1].lower() 
    # 결합 후 return 합니다.
    return "/".join(
        [
            ymd_path,
            uuid_name + extension,
        ]
    )


class FileModel(models.Model):
    title = models.CharField(max_length=100, unique=True)
    uploadDate = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, blank=False, null=True, on_delete=models.SET_NULL)
    file = models.FileField(upload_to=dateUploadTo) # FileField의 upload_to 속성에 위에서 작성한 함수를 설정해주면 해당 경로와 이름으로 업로드 됩니다.

    def __str__(self):
        return self.title

@receiver(post_delete, sender=FileModel)
def fileDeleteAction(sender, instance, **kwargs):
    instance.file.delete(False)
  • dateUploadTo함수에서는 날짜별로 경로를 세분화 하고 파일 고유이름을 설정해서 return 해주도록 설정했습니다.
  • FileModel모델의 file필드에 upload_todateUploadTo함수로 설정해놓으면 해당 경로와 이름으로 업로드 됩니다.
  • Django receiver와 signal을 통해 모델이 삭제되었을 때의 action을 설정해줍시다. 모델이 삭제되었을 때, 파일의 기본 값은 instance.img.delete(save=True)입니다. 모델이 삭제 되어도 file은 save=True 즉, 저장 해놓는다는 뜻입니다. 이것을 save=False로 바꿔주면 됩니다.

추가

Signal에 대해서 간단히 정리하자면 Django에서 특정 이벤트(signal)가 발생했을 때, 그것을 캐치해서 추가적인 Action을 설정할 수 있습니다. 자세한 사항은 Django SignalsDjango Signals Method에서 확인할 수 있습니다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글