多表子类模型的管理通用内联被打破---任何替代方案?

时间:2008-11-22 12:43:54

标签: python django django-models django-admin

这是我正在尝试做的事情,并且失败了......

我有一个与其他对象有通用关系的File模型:

class File(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    file = models.FileField(upload_to='files/%Y/%m/%d')
    # etc....

我还希望有一个File子类来处理要在页面中显示的图像的特定情况,而不是下载:

class Image(File):
    file = models.ImageField(upload_to='files/%Y/%m/%d')

所有上述工作都很好,包括File模型的通用内联,直到我想使用Image模型的泛型内联---保存过程无法创建基类实例,因此引发错误说明Image.file_ptr(基类的'secret'外键)不能是None。

因此,基本上,泛型内联目前不能正确支持多表继承。

我很可能让它变得比它需要的更复杂,所以有人可以建议解决这个问题,或者更好的方法来达到同样的目的吗?

如果您需要进一步澄清,请与我们联系。

1 个答案:

答案 0 :(得分:0)

继承可以在关系模型中以两种方式实现。

子类可以是一个新表,其中所有列都与重复的超类相同。当你有一个覆盖超类的抽象超类或子类特性时,这很有效。

子类可以只是具有超类表连接的唯一列。当你有一个具体的超类时,这很有效。

在您的情况下,您可能会看到以下内容。

class FileFacts( models.Model ):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

class DownloadFile( models.Model ):
    facts = models.ForeignKey( FileFacts )
    file = models.FileField(upload_to='files/%Y/%m/%d')

class InlineImage( models.Model ):
    facts = models.ForeignKey( FileFacts )
    file = models.ImageField(upload_to='files/%Y/%m/%d')

这是我喜欢处理类似子类的模型。