多表子类模型的管理通用内联损坏——有什么替代方案?

2 投票
1 回答
453 浏览
提问于 2025-04-11 18:50

我现在遇到了一些问题,想做的事情没有成功……

我有一个文件模型,这个模型可以和其他对象建立通用关系:

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

我还想创建一个文件的子类,用来处理特定的情况,比如在页面上显示的图片,而不是下载它们:

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

以上所有内容都运行得很好,包括文件模型的通用内联,直到我想使用图片模型的通用内联——在保存的过程中,它没有成功创建基类的实例,因此出现了一个错误,提示说Image.file_ptr(指向基类的“秘密”外键)不能为None。

所以,基本上,目前通用内联并不支持多表继承。

很可能是我把事情搞得太复杂了,所以有没有人能建议一个解决这个问题的方法,或者更好的实现同样目标的方式?

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

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

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

撰写回答