【发布时间】:2014-11-29 02:31:33
【问题描述】:
我正在使用 Account 模型,我想将它与 Settings 模型内部连接,而不必在我的 Account 模型中创建额外的 settings_id 列,因为 Account 表上的 PK 与设置上的 PK准确的表。我一直在尝试在这些表和列之间建立 OneToOne 关系,但不知道如何在不必创建新列或其他东西的情况下做到这一点。我正在尝试尽可能多地使用现有架构,并且不希望创建不必要的列。
Class Account(models.Model):
login_id = models.AutoField(primary_key=True)
settings = models.OneToOneField('Settings', to_field='login_id', null=True,
related_name='settings', db_column='login_id') # Doesn't work because login_id already exists....
Class Settings(model.Model):
login_id = models.OneToOneField('Account', to_field='login_id', related_name='account')
基本上,我要复制的查询是:
SELECT * FROM account
INNER JOIN settings
ON account.login_id=settings.login_id
WHERE account.login_id=1
基于错误,Django 的 ORM 似乎确实坚持在 Account 表中创建新列,但是当 2 个表之间的关系如此简单时,我看不出添加新列的意义:account.login_id = settings.login_id
【问题讨论】:
-
为什么两个模型相互指向是一对一的关系?您不需要在双方都指定。在其中任何一个上删除它。可通过 ORM 访问的正向和反向关系
-
既然他们是相关的,这似乎是合乎逻辑的。我认为这不会导致我正在创建的错误,但我会尝试从“设置”模型中删除关系,看看是否有帮助。
-
这将是问题的一部分。另一件事是 - 你到底想达到什么目的?在典型情况下,您似乎不必运行这样的查询。
-
我有每个用户的帐户表和每个用户的设置表。这些表上的 PK 是相同的。我正在处理应用程序的设置部分,我们将在功能完成后为每个用户回填设置。因此,尚未为每个用户提供设置。我想设置模型以便强制执行相同的 PK(我认为双方的 OneToOne 会这样做)
-
同意。这是实现此目的的一种方法(至少让您入门):stackoverflow.com/questions/2846029/… - 在保存时检查对象是否存在,如果不存在,则创建并分配。
标签: python django django-models inner-join