Django中的非主外键

Posted

技术标签:

【中文标题】Django中的非主外键【英文标题】:Non-primary foreign keys in Django 【发布时间】:2015-10-03 10:18:51 【问题描述】:

我有两个来自旧数据库的表,我想从 Django 站点访问它们。它们看起来像这样:

Table A
id (int, primary key)
name (string, unique)
...

Table B
id (int, primary key)
name
record_date
(name, record_date are unique together)
...

如何告诉我的 Django 模型表 AA.name=B.name 上的 B 具有一对多关系?常规的ForeignKey 关系要求B 使用A.id 而不是name,但我无法修改现有遗留数据库的结构。

【问题讨论】:

【参考方案1】:

Django 的 models.ForeignKey 文档不是很清楚。如果您有两个模型反映在数据库中:

class Blockchain(models.Model):
    symbol = models.CharField(max_length=50, primary_key=True, unique=True)

class Wallet(models.Model):
    index = models.AutoField(primary_key=True)
    wallet = models.CharField(max_length=100, null=True)
    blockchain = models.ForeignKey(Blockchain, to_field="symbol", db_column="blockchain")

“to_field”实际上是Foreign模型中的字段名称。

“db_column”是要在本地模型中将外键重命名为的字段的名称

【讨论】:

这应该是公认的答案。该示例是通用的,避免与原始问题字段名称混淆。 为什么在Wallet 中的字段blockchain 上需要db_column="blockchain",而该字段已经被称为blockchain 否则按照标准 Django 命名,该字段将被称为 blockchain_id。【参考方案2】:

使用to_fielddb_column 选项。

class B(models.Model):
    name = models.ForeignKey(A, to_field="name", db_column="name")

创建外键后,您可以按如下方式访问值和相关实例:

>>> b = B.objects.get(id=1)
>>> b.name_id # the value stored in the 'name' database column
>>> b.name # the related 'A' instance

【讨论】:

以上是关于Django中的非主外键的主要内容,如果未能解决你的问题,请参考以下文章

( 10 )MySQL中的外键

3.啥是键、候选键、主键和外键?

怎样在oracle中创建主外键和唯一约束

sql server的主键与外键问题

MySQL

Django--ORM 多表查询