2

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

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

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(基类的“秘密”外键)不能为无。

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

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

如果您需要进一步说明,请告诉我。

4

1 回答 1

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

这是我对处理子类模型的偏好。

于 2008-11-22T13:30:28.187 回答