python - Django 模型 OneToOneField 无需创建额外的 _id 数据库列

标签 python django django-models inner-join

我正在使用一个帐户模型,我想将它与一个设置模型进行内部连接,而不必在我的帐户模型中创建一个额外的 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.settingssettings。帐户settings.account_id

关于python - Django 模型 OneToOneField 无需创建额外的 _id 数据库列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188997/

相关文章:

python - 尝试创建一个仅包含唯一数字的排序列表

python - 从 BeautifulSoup 的表中排除 Span 类

python - 使用 csv.reader 在 Python 中读取同一文件中具有两个不同分隔符的文件

MongoDB 的 Python 日期对象

带有 xapian 引擎的 Django-haystack : can't execute update_index if model has ManyToManyField

django 查询集按字段分组

python - Django预取相关和选择相关

python - 将字典输出写入文件 - Python

javascript - Django:如何在另一个 javascript 文件中导入 javascript

python - 如何在没有嵌套循环的情况下检查两个模型ID?