Django中的非主要外键

Tho*_*son 15 python mysql django

我有一个遗留数据库中的两个表,我想从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)
...
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*air 28

使用to_fielddb_column选项.

class B(models.Model):
    name = models.ForeignKey(A, to_field="name", db_column="name")
Run Code Online (Sandbox Code Playgroud)

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

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


小智 21

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")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 否则,根据标准 Django 命名,该字段将被称为 Blockchain_id。 (4认同)
  • 当“Wallet”中的“blockchain”字段已经被称为“blockchain”时,为什么需要“db_column="blockchain””? (3认同)
  • 这应该是公认的答案。该示例是通用的,避免与原始问题字段名称混淆。 (2认同)
  • 需要注意的是,“to_field”*必须*是唯一的。 (2认同)