Поле файла производной модели недоступно

У меня есть базовая модель и полученная из нее модель. Базовая модель не абстрактна, поэтому с ней также связана таблица.

Проблема: сначала я создаю базовый экземпляр, а затем производный экземпляр. И связать производный экземпляр с базой. Но я получаю 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 не получает идентификатор после этого.
  • После dobj.save()кажется, что атрибуты в базовом классе перезаписываются атрибутами в производном классе.
  • я добавил ctime создано время в BaseModel по умолчанию datetime.datetime.utcnow, Поэтому, когда я сохраняю производный объект, ctime обновляется, чтобы сэкономить время производного объекта.
  • Когда я смотрю на БД через sqlitebrowser, filepath поле BaseModel строка пуста

>>> 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)

Благодарю.

1 ответ

Попробуй это:

dobj = DerivedModel()
dobj.basemodel_ptr=obj
dobj.save_base(raw=True)
Другие вопросы по тегам