这是我正在尝试做的事情,并且失败了......
我有一个与其他对象有通用关系的File模型:
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。
因此,基本上,泛型内联目前不能正确支持多表继承。
我很可能让它变得比它需要的更复杂,所以有人可以建议解决这个问题,或者更好的方法来达到同样的目的吗?
如果您需要进一步澄清,请与我们联系。
答案 0 :(得分: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')
这是我喜欢处理类似子类的模型。