Django模型和主要 - 外键关系

时间:2013-05-31 19:13:07

标签: python sql django-models

我正在编写一个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基本上模拟了一个复合键,并允许多个字段具有主键功能。我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:2)

  

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

不完全。它只是在指定的字段中添加了一个复合UNIQUE KEY,并且在创建表时才真正起作用,如果您使用Django访问旧表,则不会应用。在Django中仍然不支持复合PRIMARY KEY(参见bug #373)。

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

另见this question