Django有很多很多的递归关系

时间:2011-08-16 14:55:16

标签: django oracle django-models

我对数据库的关注度不是很高,如果我不能很好地描述这一点,那就很抱歉......

我有一个现有的Oracle数据库,它描述了一个算法目录。 有两个表algorithims和xref_alg。

Algorithims可以有父子算法。 Alg_Xref包含两个外键的关系 - xref_alg和xref_parent。

这些是我迄今为止从inspectdb命令

获得的Django模型
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需要一个模型来拥有一个主键。生命太短暂,所以刚刚添加了一把主键。这会对性能产生什么影响吗?

1 个答案:

答案 0 :(得分:2)

目前这是Django提供的ORM的限制。每个模型必须有一个标记为primary_key=True的字段,如果没有,则框架会自动创建名为AutoField的{​​{1}}。

然而,正如我们今年的Google Summer of Code中所说的那样,这一点正在进行中,并希望在今年年底之前将在Django中发布。现在你可以尝试使用https://github.com/koniiiik/django提供的Django分支,它包含一个实现(虽然尚未完成,但应该足以满足你的目的)。

至于是否有任何好处,取决于。如果您只是为每个表添加一个自动递增id列,它肯定会使数据库更具可重用性并减少令人头疼的问题。性能影响不应该太高,您可能会注意到的唯一事情是,如果您有这样的多对多表,只包含两个id列,则添加第三个列将增加其大小一半。但是,只要您不在该表中存储数十亿行,那就应该无关紧要了。