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 模型表 A
与 A.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_field
和db_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中的非主外键的主要内容,如果未能解决你的问题,请参考以下文章