2014-06-24 2 views
0

나는 다음과 같은 방식으로 저장됩니다 업로드를 허용 할 :외래 키를 가져 오는 방법은 무엇입니까?

class Upload(models.Model): 
    user = models.ForeignKey(User) 
    category = models.ForeignKey(Category) 
    file = models.FileField(upload_to='uploads/' + str(category.pk) + '/' + str(user.pk)) 

    class Meta: 
     unique_together = ('user', 'category') 

이러한 방식으로, 각각의 업로드가 먼저 카테고리 ID에 의해 다음 사용자 ID에 의해, 자신의 디렉토리에 샌드 박스 될 것이다. 나는 중복 된 파일 이름에 대해 걱정할 필요가 없으며 디렉터리 구조가 깔끔하고 체계적 일 것입니다.

그러나 ForeignKey에는 pk의 인스턴스가 없으므로 위의 코드는 실제로 작동하지 않습니다. 범주 및 사용자를 기반으로 디렉토리에 파일을 저장하는 방법이 있습니까? 또는 Django에서 파일 업로드를 구성하는 데 일반적으로 사용되는 또 다른 전략이 있습니까?

답변

0

당신은 upload_to에 대한 호출 기능을 사용할 수 있습니다 : 여기 해결하기 위해 두 가지가 있습니다

import os 

def upload_path(instance, filename): 
    return os.path.join('uploads', str(instance.category.pk), str(instance.user.pk)) 

file = models.FileField(upload_to=upload_path) 
0

.

빠른 것은 관련 Categorypkself.category_id와 메모리 Upload 인스턴스에서 사용할 수 있는지, 그리고 관련 Userpkself.user_id입니다.

좀 더 복잡한 것은 동적 인 upload_to을 사용하면 임의의 표현식 대신 호출 가능하도록 지정해야한다는 것입니다. the docs :

이 파일 이름은 파일 이름을 포함하여 업로드 경로를 얻기 위해 호출되는 함수와 같은 호출 가능 파일 일 수도 있습니다. 이 호출 가능 객체는 두 개의 인수를 받아 들일 수 있어야하고 유닉스 스타일의 경로 (슬래시 포함)를 반환하여 스토리지 시스템에 전달할 수 있어야합니다. 전달되는 두 인수는 다음과 같습니다

예를

및 FileField가 정의 된 모델의 인스턴스입니다. 보다 구체적으로, 이것은 현재 파일이 첨부되는 특별한 경우입니다.

대부분의 경우이 개체는 데이터베이스에 아직 저장되지 않았으므로 기본 자동 필드를 사용하는 경우 기본 키 필드의 값이 아직 없을 수 있습니다.

파일 이름

원래 파일에 주어진 파일 이름. 최종 목적지 경로를 결정할 때 고려 될 수도 있고 고려되지 않을 수도 있습니다. 그런

def upload_location(upload, original_filename): 
    return os.path.join(str(upload.category_id), str(upload.user_id), original_filename) 

또는 뭔가 :

그래서 당신이 원하는 경로를 Upload 인스턴스를 취하고 반환하는 함수를 정의 할 수 있습니다. 그런 다음 모델에서 사용 : - ㅎ 내가 사용하는 생각

file = models.FileField(upload_to=upload_location) 
+0

'내가 당신을 복사 한 :) –

+0

@AamirAdnan을 os.path.join' 생각하지 마십시오. 그 비밀은 깊이 숨겨진 비밀이 아닙니다. 나는 당신의 대답으로 정수형 FK를 문자열화할 필요성을 생각 나게했다. –

관련 문제