模型继承和多态的问题

时间:2010-09-09 02:07:35

标签: python django polymorphism

我带来了新的django问题。 situtaion:我有一个模型类UploadItemModel,我可以创建它来创建可上传的项目,如视频,音频文件......

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

我像这样继承它:

class Video(UploadItem):
    category = 'video'

我需要从自定义标记访问类别属性。问题是我得到category ='abstract item',即使该类实际上是Video。

有任何线索吗?

编辑:我需要使用层次结构,因为我有几种类型的用户可以上传的项目(视频,音频文件,PDF文本)。我需要为每种类型创建一个类,但这些类之间有很多共同点(例如表单)。

3 个答案:

答案 0 :(得分:1)

  

有任何线索吗?

是。 AFAIK它不会像你希望的那样工作。 Django模型不是简单的Python类。它们更像是元类,它创建了一种“隐藏”类定义的实例。是的,预期的模型类存在,但它不是你想象的那样。首先,您使用的类是从您的类定义为您构建的。这就是为什么Python类的一些静态特性不能像你在Django模型中所期望的那样工作的原因。

你无法真正使用这样的类级别项目。

您可能想要创建一个具有默认值或类似内容的实际字段。

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

即使将评论添加到问题中,我仍然不清楚为什么要这样做。似乎没有任何结构或行为差异。这些看起来都像是一类对象。子类似乎没有定义任何新内容。

选项。

  1. 只需在班级使用班级名称而不是此“类别”项目。使类名足够好,不需要这个“类别”项。

  2. 使用属性

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

答案 1 :(得分:1)

您需要创建一个附加字段,该字段将成为该类型的描述符。

有一个很好的教程here解释了如何在Django模型中使用继承

答案 2 :(得分:0)

您是否可以尝试重写类的__init__方法,为每个实例分配category?例如,

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