我刚刚开始使用Django的contenttypes框架(而且非常棒)。我有一个Area对象,它有许多专门的Block对象 - 我已将其建模如下。
class Area(models.Model):
...
class SomeBlock(models.Model):
...
class AreaBlock(models.Model):
area = models.ForeignKey(Area)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
block_object = generic.GenericForeignKey('content_type', 'object_id')
这非常有效。现在我想在他们自己的表中注册这些专用块以及关于它的额外“全局”信息。
class BlockRegistrar(models.Model):
...
我的问题是将SomeBlock加入BlockRegistrar模型中的全局信息。块表中的外键很明显,但它永远不会改变,我无法弄清楚如何使用django的ContentType表来进行这些连接。
任何帮助?
答案 0 :(得分:0)
因此,AreaBlock.block_object
是几种可能的SomeXXBlock
模型之一的GenericForeignKey吗?
您的意思是每个SomeXXBlock
记录都有相应的BlockRegistrar
记录吗?
最简单的方法是使用model inheritance:
class BlockRegistrar(models.Model):
# 'global' fields common to all SomeXXBlock models
...
class SomeBlock(BlockRegistrar):
...
class SomeOtherBlock(BlockRegistrar):
...
在幕后,Django会自动创建一个OneToOneField,将SomeXXBlock
实例链接到相应的BlockRegistrar
。在Django中,这称为“多表继承”。根据你的问题,听起来这可能是你想要的。
如果您永远不需要直接访问BlockRegistrar
对象,只想让全局字段在所有SomeXXBlock
'子'模型上可用,那么您可以使用抽象基础模型:
class BlockRegistrar(models.Model):
# 'global' fields common to all SomeXXBlock models
...
class Meta:
abstract = True
class SomeBlock(BlockRegistrar):
...
class SomeOtherBlock(BlockRegistrar):
...
在这种情况下,BlockRegistrar
模型不作为数据库中的表存在,并且没有向SomeXXBlock
模型添加神奇的OneToOneField。