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