Django:遵循一对一关系的相反方向

时间:2011-09-26 08:52:41

标签: database django model one-to-one

我对Django模拟一对一关系的方式有疑问。

假设我们有两个模型:A和B:

class B(models.Model):
      bAtt = models.CharField()

class A(models.Model):
      b = models.OneToOneField(B)

在创建的表A中,有一个字段“b_id”,但在由Django创建的表B中,没有“a_id”这样的字段。

因此,给定一个A对象,只需通过A行的“b_id”列就可以快速检索相应的B对象。

但是Django如何在给定B对象的情况下检索A对象?

最糟糕的情况是扫描A表以在“b_id”列中搜索B.id。如果是这样,我们建议在B模型和表中手动引入额外的字段“a_id”吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

Django通过SQL中的JOIN检索字段,有效地将两个表的行融合在一起,其中b_id与B.id匹配。

假设您有以下表格:

# Table B
| id | bAtt    |
----------------
|  1 | oh, hi! |
|  2 | hello   |

# Table A
| id | b_id |
-------------
| 3  |  1   |
| 4  |  2   |

然后B.id = b_id上的联接将创建以下元组:

| B.id | B.bAtt  | A.id |
------------------------
|  1   | oh, hi! |  3   |
|  2   | hello   |  4   |

Django无论你从哪一方进入关系都这样做,因此同样有效:)数据库实际上如何进行连接取决于数据库实现,但是以某种方式它必须经历每个元素每个表并比较连接属性。

答案 1 :(得分:2)

将id存储在其中一个表中就足够了。

在案例1中,(a.b)生成的SQL将是

SELECT * from B where b.id = a.b_id

在案例2中,SQL将是:

SELECT * from A where a.b_id = b.id

您可以看到以任一方式生成的SQL都是相似的,并且分别依赖于它们的大小。

在几乎所有情况下,索引都应该足够,只需1个id即可获得良好的性能。

答案 2 :(得分:2)

  

其他对象关系映射器要求您在两侧定义关系。 Django开发人员认为这是DRY(不要重复自己)原则的违反,所以Django只要求你在一端定义关系。

请务必查看doc;)