2011-09-26 56 views
2

我对Django建立一对一关系的方式有疑问。Django:遵循一对一关系的相反方向

假设我们有2种型号:A和B:

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

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

在创建表A,有一个领域“B_ID”,但在Django在创建表B中有没有这样的字段作为“A_ID ”。

因此,给定的目的,它肯定快速获取相应的B对象,只需通过A的行的列“B_ID”。

但如何Django的检索给出的B对象的一个​​目的?

最坏的情况是扫描经过A表来搜索B.id在列“B_ID”。如果是这样,建议我们在B模型和表格中手动引入一个额外的字段“a_id”?

在此先感谢!

回答

2

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

在情况1中,(AB)生成的SQL是

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

和在情况2中,SQL是:

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

可以看到,获得的SQL生成无论哪种方式都类似和分别取决于它们的大小。

在几乎所有情况下,索引应该足够了,性能将是一件好事只有1 ID。

+1

谢谢。这是有用的,我正在寻找。我也刚刚意识到,即使在给定A的情况下,我们立即有b_id,但是然后要检索整个B对象,它仍然需要“扫描”,正如在相反的情况下。 –

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中做到这一点不管,和因此同样有效:)数据库实际上如何实现连接取决于数据库实现,但以某种方式它必须遍历每个表中的每个元素并比较连接属性。

+0

不要忘了ID被索引,所以扫描总是会很快。 –

2

其他对象关系映射器需要您定义双方的关系。 Django的开发人员认为这是DRY(Do not Repeat Yourself)原理的冲突,所以Django只要求你在一端定义关系。

始终以看看doc;)

+0

此信息非常有用,谢谢Mansuro。这不是选择作为答案,因为它不直接解决我关于性能的问题。 –