Skip to main content
 首页 » 编程设计

python之多表子类模型的管理通用内联被破坏了---有什么选择吗

2025年05月04日7sky-heaven

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

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

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。

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

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

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

请您参考如下方法:

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

子类可以是一个新表,其中重复了父类(super class)的所有相同列。当您具有抽象父类(super class)或覆盖父类(super class)的子类功能时,这很有效。

子类可以只是与父类(super class)表连接的唯一列。当您有一个具体的父类(super class)时,这很有效。

在您的情况下,看起来您可能具有以下内容。

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

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