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_to
를 dateUploadTo
함수로 설정해놓으면 해당 경로와 이름으로 업로드 됩니다. Signal에 대해서 간단히 정리하자면 Django에서 특정 이벤트(signal)가 발생했을 때, 그것을 캐치해서 추가적인 Action을 설정할 수 있습니다. 자세한 사항은 Django Signals과 Django Signals Method에서 확인할 수 있습니다.