2008-11-22 14 views
2

這裏就是我想要做的,沒有...多表子類模型的管理通用內聯破壞---任何替代方法?

我有有一個通用的,相對於其他對象的文件模式:

class File(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 
    file = models.FileField(upload_to='files/%Y/%m/%d') 
    # etc.... 

我也想有一個子要顯示在頁面類文件處理圖像的具體情況,而不是下載:

class Image(File): 
    file = models.ImageField(upload_to='files/%Y/%m/%d') 

的一切,直到我想使用一個以上的正常工作,包括文件模型的通用內聯, Image模型的通用內聯---保存過程ess無法創建基類實例,因此引發錯誤,指出Image.file_ptr(基類的「祕密」外鍵)不能爲None。

因此,基本上,通用內聯目前不能正確支持多表繼承。

這很有可能使得這個問題變得比需要的更復雜,所以任何人都可以提出解決這個問題的方法,或者達到相同目的的更好方法嗎?

如果您需要進一步澄清,請讓我知道。

回答

0

繼承可以在關係模型中以兩種方式實現。

一個子類可以是一個新的表,其所有列都與重複的超類相同。當你有一個重載超類的抽象超類或子類特徵時,這很有效。

子類可以是加入超類表的唯一列。當你有一個具體的超類時,這很有效。

就你而言,看起來你可能有以下幾點。

class FileFacts(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

class DownloadFile(models.Model): 
    facts = models.ForeignKey(FileFacts) 
    file = models.FileField(upload_to='files/%Y/%m/%d') 

class InlineImage(models.Model): 
    facts = models.ForeignKey(FileFacts) 
    file = models.ImageField(upload_to='files/%Y/%m/%d') 

這是我的首選處理子類模型。