2012-08-07 115 views
2

我想弄清楚保存我使用django orm的模型的最佳方法。我有一个模型/表,User。另外,我有一个名为ContactInfo的模型/表,我们在这里存储一个外键给用户表。用外键保存django orm模型

我知道普通的django orm的做法是将ContactInfo模型的外键放到用户模型中,但是在这一点上,我们不想添加任何东西到已经是单块的用户表中,所以我们把将外键插入到ContactInfo模型中。

我知道我可以将用户模型存储在ContactInfo模型中,调用保存在ContactInfo中,并且它应该保存用户模型,但是如果我与用户及其联系人信息存在一对多关系,该怎么办?我宁愿在联系人信息模型/对象的(1多个)实例中没有多个用户表实例。

如果我能清除任何东西,请让我知道。在当前时刻,我有最好的办法是到的ContactInfo列表的一个实例存储为user.contact_info,并覆盖保存用户user.save()方法来检查contact_info,而且如果它存在插入user.id到每个模型和保存。不幸的是,我觉得这有点麻烦,但是对于Django和Python来说,我不确定我的选择。

任何帮助将不胜感激,谢谢!

+0

Django不提供多对多类型吗?它会为你创建“中间”表。 – imm 2012-08-07 05:00:39

回答

1

我不知道我是否正确理解你的问题。 Django为1-N关系提供了很好的支持。如果ContactInfo的外键为User,则默认情况下为1-N映射。

 
ContactInfo ---------> User 
      N   1 

所以,只有一个User数据库中的记录,像这样

 
Table User    Table ContactInfo 
--------------------------------------------- 
id  user_name    id  user_id 
1  someone    1   1 
           2   1 
           3   1 

而且你也不需要重写save方法。当你需要如果你使用上面的方法插入一个新ContactInfo记录添加联系人,

contact = ContactInfo(user=target_user) 
# other stuff 
contact.save() 
#or 
target_user.contactinfo_set.create(...)#contactinfo_set is the related name of target_user 
#Django maintains the foreign key things. 

,那么你并不需要遍历您contact_info列表中插入user.id到数据库中。

0

我不知道,如果你的意思定制User模型或标准模型附带Django的。如果是后者,则Django提供存储附加信息的标准方式,称为用户配置文件,与每个用户相关联。有关详细信息,请参见this section in the documentation

+0

是啊,对不起,我知道有一个用户模型,我刚刚为了这个问题的目的而改变了名字。我的实际模型不称为用户,我对此感到抱歉。 – Brett 2012-08-07 14:22:47