2009-12-08 58 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 /#選項 ...然後觸發IntegerField值的upload_to值。如果可以避免的話,在圖像表上查詢加入是沒有意義的。 – 2009-12-09 00:03:42

0

這是我能想到的DRYest方式。

編輯: 我意識到我的回答並不是最有用的 - 對不起!然而,andylei的答案會起作用,但你仍然需要創建你的子類。如果你打算創建子類,我會選擇明確的。根據Unix Philosophy,Clarity比Cleverness好。安迪利的答案可能很聰明,但它增加了不必要的複雜性,而沒有增加任何真正的優勢。編寫代碼以便讀取和維護。我絕對可以看到一個情況,你可能不想將你的文件夾命名爲與你的班級名稱相同的名稱。