这是我正在尝试做的,但失败了...
我有一个文件模型,它与其他对象具有通用关系:
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')
这是我处理类子类模型的偏好。
