2011-08-16 94 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列,添加第三个表会将其大小增加一半。但是,只要您不在该表中存储数十亿行,就应该是无关紧要的。