2011-02-13 92 views
4

下面的代碼工作,我期望它打破:Django的外鍵與多表繼承

class General(Model): 
    pass 

class Captain(Model): 
    general = ForeignKey('General',related_name='captains') 

我可以創建一個一般情況下,加船長,並做「general.captains」按預期工作。

但是,如果這兩個類都從可能具有額外信息的基類繼承,則會發生災難性衝擊。

class Officer(Model): 
    pass 

class General(Officer): 
    pass 

class Captain(Officer): 
    general = ForeignKey('General',related_name='captains') 


>>> g = General() 
>>> g.captains 
    Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 
391, in __get__ 
    self.related.model._default_manager.__class__) 
    File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 
469, in create_manager 
    getattr(instance, attname)} 
    File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 
301, in __get__ 
    raise self.field.rel.to.DoesNotExist 
DoesNotExist 

任何想法可能發生在這裏,以及我如何解決它?

+0

我面臨類似的問題,我傾向於認爲這是一個已知的問題。 「避免二級怠速」是銀彈。 – 2011-02-16 07:35:00

回答

0

,如果你明確地定義你的Officer模型abstract

class Meta: 
    abstract = True 

它應該工作,以便測試我稍加修改你的基類:

class Officer(models.Model): 
    name = models.CharField(max_length=255) 
    class Meta: 
     abstract = True 

而以下工作:

>>> General(name='Warfield').save() 
>>> G = General.objects.all()[0] 
>>> Captain(name='Picard', general=G).save() 
>>> C = Captain.objects.all()[0]  
>>> C.general.name 
u'Warfield' 
>>> G.captains.all()[0].name 
u'Picard'