본문 바로가기

기술

[Django] 파일 저장 경로 지정

파일 저장 경로 지정

장고에서 이미지와 같은 파일을 다루다보면 파일을 저장할 경로를 설정해야 한다. 이는 Django field type 문서의 FileField의 FileField.upload_to 설정을 해주면 가능하다. 해당 부분을 찾아서 읽어보자.

https://docs.djangoproject.com/en/2.2/ref/models/fields/#filefield

 

Model field reference | Django documentation | Django

Django The web framework for perfectionists with deadlines.

docs.djangoproject.com

이때, 파일 경로에 객체의 아이디 값을 사용하고 싶을 때가 있을 것이다. 문제는 객체를 생성하는 동시에 이미지를 저장하고 싶을 때이다. 다음 예시를 보도록 하자. 다음은 review 객체와 InteriorImage 객체를 동시에 생성하고 있는 경우이다.

def interior_directory_path(instance, filename):
    return '{0}_{1}/review_{2}/interior/{3}'.format(
        instance.review.restaurant.__str__(), 
        instance.review.restaurant.id, 
        instance.review.id, 
        filename
    )
    
class InteriorImage(models.Model):
	# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    review = models.ForeignKey(Review, models.CASCADE, verbose_name='리뷰')
    image = models.ImageField('내부사진', max_length=255, upload_to=interior_directory_path)

위 코드에서 오류가 발생하는 이유는 review 객체 생성 전에 review id를 부여하기 때문에 None 값으로 에러가 뜨는 것이다. 이를 해결하기 위해서는 여러가지 방법이 있는데 가장 쉬운 방법은 review 객체에 id 값으로 uuid Field를 사용하는 것이다.

 

기존의 경우 데이터베이스에 저장될 때 id 값이 1씩 증가하는 방식이라면, uuid 값을 사용할 경우 객체가 생성되기 전에 (즉, 데이터베이스에 저장되기 전에) 고유 id 값이 부여된다. uuid 값을 이용하는 것 말고도 dynamic하게 id를 주는 방법이 존재하기는 한다.

https://stackoverflow.com/questions/41428290/django-instance-id-none-when-uploading-image

 

django instance.id=None when uploading image

instance.id is returning None when upload images through the admin page. The idea was to upload all the images of each Residence to a different folder. Here's my code: models.py from django.db im...

stackoverflow.com