我对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”吗?
提前致谢!
答案 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;)