我正在使用一个帐户模型,我想将它与一个设置模型进行内部连接,而不必在我的帐户模型中创建一个额外的 settings_id
列,因为帐户表上的 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 表中创建一个新列,但是当两个表之间的关系如此简单时,我看不到添加新列的意义: account.login_id = settings.login_id
最佳答案
虽然我自己从未尝试过,但将 OneToOneField
声明为主键应该可行。
class Account(models.Model):
login_id = models.AutoField(primary_key=True)
class Settings(model.Model):
account = models.OneToOneField('Account', to_field='login_id',
primary_key=True, related_name='settings')
声明 primary_key
将阻止 Django 尝试为您创建主键列,并且通过此设置您可以访问 account.settings
和 settings。帐户
或 settings.account_id
。
关于python - Django 模型 OneToOneField 无需创建额外的 _id 数据库列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188997/