是否可以在另一个模型中定义引用多列的外键?
例如,一个外键引用product表中的两列索引和sql语句:
FOREIGN KEY (product_category,product_id) REFERENCES product(category,id)
顺便说一下,我已经研究过django.contrib.contenttypes,并不认为这是这种场景的完美解决方案.
解决方法
它尚不支持.如果你愿意,有一张票和可能的方法来处理它.也许你甚至可以运行
custom sql
多列主键支持
关系数据库设计使用一组列作为表的主键.当此集包含多个列时,它被称为“复合”或“复合”主键. (有关术语的更多信息,请参阅讨论数据库密钥的文章).
目前,Django模型仅支持此集合中的单个列,从而拒绝许多设计,其中表的自然主键是多列. Django目前无法使用这些模式;它们必须引入冗余的单列密钥(“代理”密钥),迫使应用程序在任何给定实例中对表使用哪个密钥进行任意和其他不必要的选择.
本页讨论如何让Django支持这些复合主键.这里有很多细节,但是做得恰到好处,它将为数据建模提供更多的灵活性和潜在的简单性.
当前状态
当前状态是接受/分配和处理该问题,并且在http://github.com/dcramer/django-compositepks上有部分实现.该实现允许具有复合主键.但是,ForeignKey和RelatedManager中缺少对复合键的支持.因此,无法从具有复合主键的模型导航关系.
讨论:
The composite foreign key API design
注 – SqlAlchemy允许如下所述,你可以使用sqlAlchemy替换Django的ORM
也可以使用ForeignKeyConstraint对象在表级别定义外键.该对象可以描述单列或多列外键.多列外键称为复合外键,并且几乎总是引用具有复合主键的表.下面我们定义一个具有复合主键的表发票:
invoice = Table('invoice',Metadata,Column('invoice_id',Integer,primary_key=True),Column('ref_num',Column('description',String(60),nullable=False) )
然后是一个表invoice_item,其中包含一个引用发票的复合外键:
invoice_item = Table('invoice_item',Column('item_id',Column('item_name',nullable=False),ForeignKeyConstraint(['invoice_id','ref_num'],['invoice.invoice_id','invoice.ref_num']) )