使用django的contenttypes建模额外的表信息

时间:2010-02-20 12:04:37

标签: django content-type

我刚刚开始使用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表来进行这些连接。

任何帮助?

1 个答案:

答案 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。