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

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

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

因此,基本上,通用内联函数目前无法正确支持多表继承。

我很有可能使这一过程变得比其所需要的更加复杂,因此有人可以提出解决此问题的方法,还是实现同一目标的更好方法?

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

最佳答案

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

子类可以是一个新表,具有与重复的超类相同的所有列。当您具有覆盖超类的抽象超类或子类功能时,此方法效果很好。

子类可以只是与超类表连接的唯一列。当您有具体的超类时,这很好用。

就您而言,您可能具有以下特征。

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


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

关于python - 多表子类化模型的管理员通用内联损坏了-有其他选择吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/311300/

10-14 18:05
查看更多