拥有此代码:
class Part:
name = models.CharField(
_("Name of part"),
max_length=255,
help_text=_("Name of the part.")
class Meta:
verbose_name = _("Part")
verbose_name_plural = _("Parts")
abstract = True
class Book(Part):
isbn = models.CharField(
help_text=_("The ISBN of the book"),
max_length=15
)
我的模特。我下一步我需要链接到基本对象。完成此代码:
class StorageItem(models.Model):
part = models.ForeignKey(
Part,
help_text=_("The part stored at this spot.")
)
我收到此错误消息:
错误:StorageItem.part:(fields.E300)字段定义 与模型'部件'的关系,或者未安装,或者是 抽象。
将对象链接到一组从一个基类派生的不同类的正确方法是什么?
答案 0 :(得分:1)
不幸的是,无法将ForeignKeys
添加到抽象模型中。解决此限制的一种方法是使用GenericForeignKey
:
class StorageItem(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
然后您可以按如下方式使用GenericForeignKey:
book = Book.objects.create(name='test', isbn='-')
item = StorageItem(content_object=book)
item.save()
item.content_object # <Book>
快速解释其工作原理:
content_type
存储通用外键指向的模型object_id
存储模型的ID content_object
是直接访问链接的外键对象的快捷方式文档提供了有关如何使用此https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/#generic-relations
的其他信息修改强>
经过进一步研究,看起来django_polymorphic也可以做你想做的事。