Django:多表继承不允许我从基类访问派生类

时间:2012-01-24 15:48:25

标签: django inheritance models base

我想从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个不同的模型,因为我需要将它们保存在数据库中,而不必立即填写所有必填字段。

谢谢!

2 个答案:

答案 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