【问题标题】:saving a django orm model with a foreign key使用外键保存 django orm 模型
【发布时间】:2012-08-04 02:03:17
【问题描述】:

我正在尝试找出保存使用 django orm 的模型的最佳方法。我有一个模型/表格,User。此外,我有一个名为 ContactInfo 的模型/表,我们在其中存储了 User 表的外键。

我知道 django orm 的常见做法是将 ContactInfo 模型的外键放入 User 模型中,但是此时我们不想在已经很庞大的用户表中添加任何内容,所以我们将外键进入 ContactInfo 模型。

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

如果我能澄清任何事情,请告诉我。目前,我最好的想法是将ContactInfo列表的一个实例存储为user.contact_info,并覆盖用户user.save()的保存方法以检查contact_info,如果存在则将user.id插入每个模型并保存。不幸的是,我只是觉得这有点乱,但是作为 django 和 python 的新手,我不确定我的选择是什么。

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

【问题讨论】:

  • Django 不提供多对多类型吗?它会为您创建“中间”表。

标签: python django orm django-models


【解决方案1】:

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

ContactInfo ---------> 用户 氮1

所以,您的数据库中只有一条User 记录,如下所示

表用户表 ContactInfo --------------------------------------------- id 用户名 id 用户名 1 人 1 1 2 1 3 1

而且你不需要重写save 方法。当您需要添加联系人时,

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.

如果您使用上述方法插入新的ContactInfo 记录,则无需迭代您的contact_info 列表即可将user.id 插入数据库。

【讨论】:

    【解决方案2】:

    我不确定您是指自定义 User 模型还是 Django 附带的标准模型。如果是后者,那么 Django 提供了一种存储附加信息的标准方法,称为 用户配置文件,与每个用户相关联。详情请见this section in the documentation

    【讨论】:

    • 是的,对不起,我知道有一个用户模型,我刚刚将名称更改为简单的问题。我的实际模型不称为用户,对于造成的混淆,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2013-06-26
    • 2015-12-21
    • 1970-01-01
    • 2023-02-24
    • 2014-11-27
    相关资源
    最近更新 更多