我想从instanciated基础模型类中获取派生的modelclass实例。
我有以下模型类层次结构:
class AlfrescoPFCModel(models.Model):
#some fields and methods
class Meta:
abstract = True
class Contenido(AlfrescoPFCModel):
#some fields and methods
class Proyecto(Contenido):
#some fields and methods
class ProyectoCalificado(Proyecto):
#some fields and methods
class ProyectoArchivado(ProyectoCalificado):
#some fields and methods
我以这种方式实例化一个Proyecto类:
proyecto = proyecto_form.save(commit=False)
#do some stuff with some fields that dont appear on the form
proyecto.save
在另一个视图中,我尝试从以前实例化并保存在数据库中的基类Proyecto访问派生类ProyectoCalificado:
pc = ProyectoCalificado.objects.get(pk=id)
我得到:ProyectoCalificado匹配查询不存在。
我也尝试过:
p = get_object_or_404(Proyecto, id=id)
pc = p.proyectocalificado
但在第二行中出现相同的错误。
阅读文档我应该被允许这样做: #multi-table-inheritance
我想要做的是在此工作流程之后逐步完成与Proyecto(项目)相关的数据:Proyecto - > ProyectoCalificado - > ProyectoArchivado。 每个步骤我有3种不同的形式。我需要3个不同的模型,因为我需要将它们保存在数据库中,而不必立即填写所有必填字段。
谢谢!
答案 0 :(得分:1)
使用表单向导(https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/)。
<强>更新强>
如果由于您描述的情况而无法使用表单向导,那么您应该在数据库级别中将模型字段设置为空白或可空,然后仅对每个表单强制执行字段要求。创建三个级别的继承仅仅是为了创建它所需的一次性表单集,这绝对是错误的方法。它只会将您的数据分散到其他表中,并使查询更复杂,没有长期利益。
所以,例如。将模型本身设置为好像不需要任何东西(或只有第一种形式的项目)。然后,在您的第一个表单中,仅需要为该特定阶段创建必要的字段。您可以通过覆盖__init__
:
class FirstForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(FirstForm, self).__init__(*args, **kwargs)
self.fields['some_required_field'].required = True
# rinse and repeat
在您的第二个和第三个表单中执行相同操作,再次使用该特定表单所需的实际字段。
然后,每天打电话喝一杯。
答案 1 :(得分:0)
如果你有子实例,它应该有一个<base class name>_ptr
成员,指向其超类的实例。您可以将此作为filter
查询的基础来检索子项。
如果你没有做任何影响id分配的事情,你也可以假设基类和派生类的实例将具有相同的id
。