2010-02-20 46 views
2

我剛開始使用Django的contenttypes框架(它非常棒)。我有一個Area對象,它有許多專門的Block對象 - 我已經將它建模如下。用django的內容類型建模額外的表信息

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

因此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到其相應BlockRegistrar鏈接SomeXXBlock實例。在Django中,這被稱爲「多表繼承」。從你的問題,這聽起來像這可能是你想要的。

如果您不需要直接訪問BlockRegistrar對象,而只是希望在全球領域,以適用於所有的SomeXXBlock「孩子」的模型,那麼你可以使用一個抽象基模型:

class BlockRegistrar(models.Model): 
    # 'global' fields common to all SomeXXBlock models 
    ... 
    class Meta: 
     abstract = True 

class SomeBlock(BlockRegistrar): 
    ... 

class SomeOtherBlock(BlockRegistrar): 
    ... 

在這case BlockRegistrar模型不存在作爲數據庫中的表,並且沒有魔術OneToOneField添加到SomeXXBlock模型。