我是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,它完全按照我的要求表示模型(复合键等)