2011-08-16 95 views
2

我沒有那麼偉大的數據庫,很抱歉,如果我不描述這個很好...Django的多對多遞歸關係

我有其描述algorithim目錄中的現有Oracle數據庫。 有兩個表algorithims和xref_alg。

算法可以有父母和子女算法。 Alg_Xref包含這兩個外鍵的關係 - xref_alg和xref_parent。

這些都是Django模型我有這麼遠inspectdb命令

class Algorithms(models.Model): 
    alg_id = models.AutoField(primary_key=True) 
    alg_name = models.CharField(max_length=100, blank=True) 
    alg_description = models.CharField(max_length=1000, blank=True) 
    alg_tags = models.CharField(max_length=100, blank=True) 
    alg_status = models.CharField(max_length=1, blank=True) 
    ... 
    class Meta: 
     db_table = u'algorithms' 

class AlgXref(models.Model): 
    xref_alg = models.ForeignKey(Algorithms, related_name='algxref_alg' ,null=True, blank=True) 
    xref_parent = models.ForeignKey(Algorithms, related_name='algxref_parent', null=True, blank=True) 
    class Meta: 
     db_table = u'alg_xref' 

在試圖查詢AlgXref我遇到這樣的:

DatabaseError: ORA-00904: "ALG_XREF"."ID": invalid identifier 

所以錯誤似乎是,它看起來一個主鍵ID不在表中..我可以創建一個,但似乎有點無意義。無論如何要解決這個問題嗎?或者改變我的模型?

編輯:所以經過一番搜索似乎Django需要一個模型有一個主鍵。生命太短,所以剛剛添加了主鍵。這會對性能產生什麼影響嗎?

回答

2

這是目前Django提供的ORM的限制。每個模型必須有一個標記爲primary_key=True的字段,如果沒有一個,框架會自動創建名稱爲idAutoField

但是,我們在今年Google夏季守則中發言時正在努力,並有望在今年年底前在Django。現在,您可以嘗試使用包含實現(其尚未完成但應足以滿足您的需求)的https://github.com/koniiiik/django的Django分支。

至於是否有任何好處,取決於。它肯定會使數據庫更具可重用性,並且如果您只爲每個表添加一個自動遞增的id列,就會導致更少的麻煩。性能影響不應該太高,你可能會注意到的唯一的事情是,如果你有一個這樣的多對多表,只包含兩個ForeignKey列,添加第三個表會將其大小增加一半。但是,只要您不在該表中存儲數十億行,就應該是無關緊要的。