【问题标题】:Django models and primary-foreign key relationshipsDjango 模型和主外键关系
【发布时间】:2013-05-27 16:30:51
【问题描述】:

我正在编写一个 Django 应用程序,它使用现有的遗留数据以及重新映射表和关系。我得到了一个表,其中包含表之间的主外键关系,但我无法理解如何使其适应 Django 模型。

例如,一个表country_metrics被定义为

+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| ContractNum | varchar(10)   | NO   |     | NULL    |       |
| fips        | varchar(5)    | NO   |     | NULL    |       |
| metric_id   | int(10)       | NO   |     | NULL    |       |
| time_id     | int(10)       | NO   |     | NULL    |       |
| value       | decimal(12,3) | NO   |     | NULL    |       |
| eff_date    | date          | NO   |     | NULL    |       |
| exp_date    | date          | YES  |     | NULL    |       |
+-------------+---------------+------+-----+---------+-------+

我得到了一个关系映射

ContractNum primary key, foreign key references table contracts
fips        primary key, foreign key references table country
metric_id   primary key, foreign key references table metrics
time_id     primary key, foreign key references table time

在类中建模

class ContractCountyMetrics(models.Model):
  contractnum = models.CharField(max_length=10L, db_column='ContractNum', primary_key = true) # Field name made lowercase.
  fips = models.CharField(max_length=5L)
  metric_id = models.IntegerField()
  time_id = models.IntegerField()
  value = models.DecimalField(max_digits=14, decimal_places=3)
  eff_date = models.DateField()
  exp_date = models.DateField(null=True, blank=True)
  contractKey = models.ForeignKey(Contracts)
  fipsKey = models.ForeignKey(Counties)
  metricKey = models.ForeignKey(Metrics)
  timeKey = models.ForeignKey(Time)
  class Meta:
      db_table = 'txn_contract_county_metrics'
      unique_together("contractKey", "fipsKey", "metricKey", "timeKey")

根据我的阅读,unique_together基本上模拟了一个复合键,并允许多个字段具有主键功能。我在正确的轨道上吗?

【问题讨论】:

  • 我已经实现了对虚拟复合键的基本支持。无需修改数据库 stackoverflow.com/a/65404017/46548

标签: python sql django-models


【解决方案1】:

根据我的阅读,unique_together 基本上模拟了一个复合 key 并允许多个字段具有主键功能。 我在正确的轨道上吗?

不完全是。它只是在指定的字段中添加了一个复合UNIQUE KEY,并且仅在创建表期间真正有任何影响,如果您使用 Django 访问旧表,则不适用。 Django 中仍然不支持复合 PRIMARY KEYs(参见 bug #373)。

不幸的是,这可能意味着您将无法将 Django 与具有复合 PRIMARY KEY 的旧表一起使用,除非修改该表以包含 Django 兼容的 PRIMARY KEY,即单个键, 独特的, 领域。

另见this question

【讨论】:

  • 谢谢。我刚刚就这个问题与数据架构师取得了联系,可能会导致一些关系重新思考。
猜你喜欢
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2012-07-22
  • 2017-05-14
  • 2020-04-20
  • 1970-01-01
相关资源
最近更新 更多