我有一个基本模型和从中派生的模型。基本模型不是抽象的,所以它也有与之相关的表。
问题:我先创建一个基础实例,然后创建派生实例。并将派生实例与基相关联。但我在派生类中得到FileField
作为None
,即使它在父类中已保存并可用。为什么会这样?我是不是错过了什么?
一些示例代码:
def get_filepath(instance):
return u''+instance.name
def BaseModel(models.Model):
name = models.CharField(max_length=50)
filepath = models.FileField(upload_to=get_filepath,
max_length=255, null=True)
#some other fields
def DerivedModel(BaseModel):
type = models.CharField(max_length=50, null=True, blank=True)
django外壳上的样本:
>>> obj = BaseModel.objects.create(name='y')
>>> obj.id
56
>>> obj.save()
>>> obj.id
56
>>> nf=ContentFile("this is dummy text")
>>> obj.filepath.save('dummyfile', nf)
>>> dobj=DerivedModel()
>>> dobj.basemodel_ptr=obj
>>> dobj.save()
>>> dobj.id
56
>>> dobj.filepath
<FieldFile: None>
>>> obj.filepath
<FieldFile: y>
更新:对于@dgel的回答:
save_base()
是否保存派生对象?dobj
在此之后不获取id- 在
dobj.save()
之后,基类中的属性似乎被派生类中的属性覆盖 - 我在默认
datetime.datetime.utcnow
的BaseModel
中添加了ctime
创建时间。所以一旦我保存了派生对象,ctime
就会被更新以节省派生对象的时间 - 当我通过sqlitebrowser查看DB时,
BaseModel
行的filepath
字段为空
>>> dobj.save_base(raw=True)
>>> dobj.id
>>> dobj.save()
>>> dobj.filepath
<FieldFile: None>
>>> obj.ctime
datetime.datetime(2012, 8, 23, 8, 50, 3, 171573)
>>> dobj.ctime
datetime.datetime(2012, 8, 23, 8, 51, 9, 946434)
>>> newdobj = DerivedModel.objects.get(id=dobj.id)
>>> newdobj.ctime
datetime.datetime(2012, 8, 23, 8, 51, 9, 946434)
谢谢。
试试这个:
dobj = DerivedModel()
dobj.basemodel_ptr=obj
dobj.save_base(raw=True)