Django中的复合OneToOneFields

时间:2011-09-15 11:50:51

标签: django composite-primary-key

我是Django的新手,我认为我几乎已经了解了ORM的基本概念。但是,有一种特殊的情况我认为没有合理的解决方案。我有一个遗留数据库,我正在尝试编写一个Django应用程序。 这两个表的sql结构是:

mysql> describe event;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| sid       | int(10) unsigned | NO   | PRI | NULL    |       | 
| cid       | int(10) unsigned | NO   | PRI | NULL    |       | 
| signature | int(10) unsigned | NO   | MUL | NULL    |       | 
| timestamp | datetime         | NO   | MUL | NULL    |       | 
+-----------+------------------+------+-----+---------+-------+
mysql> describe alerts;
+----------------+-----------+------+-----+-------------------+----------------+
| Field          | Type      | Null | Key | Default           | Extra          |
+----------------+-----------+------+-----+-------------------+----------------+
| id             | int(11)   | NO   | PRI | NULL              | auto_increment | 
| sid            | int(11)   | YES  | MUL | NULL              |                | 
| cid            | int(11)   | YES  |     | NULL              |                | 
| confidence     | int(11)   | YES  |     | NULL              |                | 
| cvss_base      | float     | YES  |     | NULL              |                | 
| composite_conf | float     | YES  |     | NULL              |                | 
+----------------+-----------+------+-----+-------------------+----------------+

第一个表不能改变,因为它会破坏很多代码(我没有写过)。第二个表是由我写的(因此是代理键)。在第二个('alert')表中,(sid,cid)是唯一的。

问题是(sid,cid)是可以有效连接表的关键。应该如何重写模型,以便Django能够准确地捕获两个表之间的关系? 我分别为sid和cid尝试了OnetoOne,但这显然没有用,因为OnetoOne应该同时应用于(sid,cid)。 OnetoMany也没用,也不是ForeignKey,因为我需要(sid,cid)作为外键。似乎(sid,cid)复合字段应该是OnetoOne,但我不知道如何实现它。

注意 - (sid,cid)值的类型为1-55,2-55,3-55,1-56,2-57,3-60等,所有这些都是唯一的,只有两个表中都有一个条目。

晚编辑:我猜Django不支持复合onetoone键(至少谷歌集团的其中一个人说)。我迁移到SQLalchemy,它完全按照我的要求表示模型(复合键等)

1 个答案:

答案 0 :(得分:0)

Django现在不支持复合主键(:_(我知道..)但它正在处理。目前你可以声明sidcid之一{ {1}}并使用the primarykey=Trueunique_together=('sid','cid')模型中强制执行复合主键。现在关于event模型的alert和{{1} }默认情况下,django会考虑sid模型的cid关系,但您可以使用the pk属性与event关系来指向特定字段。你得到的模型看起来像:

to_field