2009-12-08 1 views
2

: 위의 경우Django의 다중 테이블 상속에서 upload_to 인수를 재정의 할 수 있습니까? 다음 코드

class Image(models.Model): 
    alt_name = models.CharField(max_length=200) 
    url = models.CharField(max_length=255, blank=True) 

class Button(Image): 
    source = models.ImageField(max_length=1024, upload_to='buttons') 

class Snapshot(Image): 
    source = models.ImageField(max_length=1024, upload_to='snapshots') 

class Banner(Image): 
    source = models.ImageField(max_length=1024, upload_to='banners') 

, 나는 자신의 업로드 폴더에 다른 종류의 각각을 업로드 할 수 있습니다. 예를 들어, 배너는 banners이라는 폴더 아래로 이동하고 스냅 샷은 snapshots이됩니다. 위의 예상대로 작동하지만 각 하위 클래스에 대한 ImageField 반복 해요. 위의 것이 목표를 달성하는 유일한 방법입니까 아니면 DRYer 방법이 있습니까?

답변

7

upload_to 인수는 호출 가능하므로 함수를 전달할 수 있습니다. http://docs.djangoproject.com :

import os 
def upload_path(instance, filename): 
    return os.path.join(instance.__class__.__name__ + 's', filename) 

class Image(models.Model): 
    alt_name = models.CharField(max_length=200) 
    url = models.CharField(max_length=255, blank=True) 
    source = models.ImageField(max_length=1024, upload_to=upload_path) 
+0

.. 대신 각 이미지 유형에 대한 상속을 사용하여, 나는이 선택을 포함하는 이미지 모델 kwarg상의 IntegerField을 만들 것입니다 : 당신이 뭔가를 할 수 있습니다/en/dev/ref/models/fields/# choices ... 그런 다음 upload_to 값을 IntegerField 값에서 트리거하십시오. 피할 수있는 경우 이미지 테이블에 대한 조인으로 쿼리 할 필요가 없습니다. –

0

내가 생각할 수있는 가장 DRYest 한 방법입니다.

편집 : 나는 내 대답이 가장 도움이되지 않는다는 것을 깨달았습니다 - 미안 해요! 그러나, andylei의 대답은 효과가 있지만 여전히 당신의 하위 클래스를 만들어야합니다. 하위 클래스를 만들려면 명시 적으로 선택하십시오. Unix Philosophy에 따르면 명확성보다 선명도가 좋습니다. andylei의 대답은 영리 할 지 모르지만, 실제 이점을 추가하지 않으면 서 불필요한 복잡성을 추가합니다. 코드를 작성하여 읽고 유지하기 쉽습니다. 폴더 이름을 클래스 이름과 동일하게 지정하지 않을 수도 있습니다.