我带来了新的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文本)。我需要为每种类型创建一个类,但这些类之间有很多共同点(例如表单)。
答案 0 :(得分:1)
有任何线索吗?
是。 AFAIK它不会像你希望的那样工作。 Django模型不是简单的Python类。它们更像是元类,它创建了一种“隐藏”类定义的实例。是的,预期的模型类存在,但它不是你想象的那样。首先,您使用的类是从您的类定义为您构建的。这就是为什么Python类的一些静态特性不能像你在Django模型中所期望的那样工作的原因。
你无法真正使用这样的类级别项目。
您可能想要创建一个具有默认值或类似内容的实际字段。
class UploadItem(UserEntryModel):
category = models.CharFIeld( default='abstract item' )
file = models.FileField(upload_to=get_upload_directory)
即使将评论添加到问题中,我仍然不清楚为什么要这样做。似乎没有任何结构或行为差异。这些看起来都像是一类对象。子类似乎没有定义任何新内容。
选项。
只需在班级使用班级名称而不是此“类别”项目。使类名足够好,不需要这个“类别”项。
使用属性
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'