多表子类模型的管理通用内联损坏——有什么替代方案?
我现在遇到了一些问题,想做的事情没有成功……
我有一个文件模型,这个模型可以和其他对象建立通用关系:
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')
这是我处理类似子类模型的偏好。