2010-09-09 59 views
1

我帶來了新的Django問題。該situtaion:我有一個模型類UploadItemModel,我subcallss它來創建上載的項目,如視頻,音頻文件...模型繼承和多態性的問題

class UploadItem(UserEntryModel): 
    category = 'abstract item' 
    file = models.FileField(upload_to=get_upload_directory) 

我繼承它是這樣的:

class Video(UploadItem): 
    category = 'video' 

我需要訪問來自自定義標籤的類別屬性。即使這個類實際上是Video,我也會得到category ='abstract item'的問題。

任何線索?

編輯:我需要使用層次結構,因爲我有幾種類型的項目,用戶可以uplaod(視頻,音頻文件,PDF文本)。我需要爲每種類型創建一個類,但是這些類(例如表單)之間有很多共同之處。

+0

他們都只是文件。爲什麼創建單獨的模型 – 2010-09-09 13:58:39

+0

@ S.Lott,因爲我有課程模型(包含一些課程),每門課程都與UploadItems有ManToOne關係。每個UploadItem渲染不同,添加方式不同,編輯方式不同......但在某些情況下(例如模板),我不需要知道UploadItem是什麼類型,我只需調用我的模板標記{%render_resource upload_item%},然後根據uploadItem的類型,我的模板標籤完成剩下的工作。 – maroxe 2010-09-09 17:20:30

回答

1

Any clue?

是的。 AFAIK它不會像你希望的那樣工作。 Django模型並不是普通的Python類。它們更像是構成一種「隱藏」類定義實例的元類。是的,預期的模型類存在,但它不是你想象的那樣。首先,你使用的類是從你的類定義中爲你創建的。這就是爲什麼Python類的某些靜態特性不像你在Django模型中所期望的那樣工作的原因。

你不能真正使用這樣的類級別的項目。

您可能想要創建一個具有默認值或類似的實際字段。

class UploadItem(UserEntryModel): 
    category = models.CharFIeld(default='abstract item') 
    file = models.FileField(upload_to=get_upload_directory) 

被添加到問題的意見後,也我仍然對爲什麼這個正在做還不清楚。似乎沒有任何結構或行爲差異。這些看起來都像是一類對象。子類似乎沒有定義任何新東西。

選項。

  1. 只需在班級使用班級名稱而不是此「類別」項目。使課程名稱足夠好,以至於不需要此「類別」項目。

  2. 你可以嘗試重寫類的__init__方法來分配category每個實例的使用屬性

    class UploadItem(UserEntryModel): 
        file = models.FileField(upload_to=get_upload_directory) 
        @property 
        def category(self): 
         return self.__class__.__name__ 
    
+0

@ S.Lott,我不想專門爲此創建一個字段,但由於沒有其他方式,這就是我要做的。我將使用選擇字段,在這種情況下更合適。 – maroxe 2010-09-09 02:52:05

+0

@ S.Lott,好吧,這並沒有解決我的問題,當重新定義Child類中的類別字段以將默認值更改爲'video'時,我得到以下錯誤:django.core.exceptions.FieldError:Local field'category'在類'視頻'與基類「UploadItem」中的類似名稱的字段發生衝突。我不能給一個可調用對象,因爲它不知道創建的實例是哪個類類型。 – maroxe 2010-09-09 03:06:54

+0

我應該使用經理嗎? – maroxe 2010-09-09 03:09:02

0

?對於例如

class Video(UploadItem): 
    def __init__(self, *args, **kwargs): 
     super(Video, self).__init__(*args, **kwargs) 
     self.category = 'video' 
1

您將需要創建一個額外的字段,該字段將是該類型的描述符。

有一個很好的教程here解釋如何使用繼承的Django模型