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