目前还不支持。如果您愿意,有一张票和可能的处理方法。也许你甚至可以运行custom sql
多列主键支持
关系数据库设计使用一组列作为表的主键。当这个集合包含多个列时,它被称为“复合”或“复合”主键。 (有关术语的更多信息,这里是一篇讨论数据库键的文章)。
目前 Django 模型只支持这个集合中的单个列,拒绝了许多表的自然主键是多个列的设计。 Django 目前不能使用这些模式;相反,他们必须引入一个冗余的单列键(“代理”键),迫使应用程序在任何给定实例中对表使用哪个键做出任意和不必要的选择。
本页讨论如何让 Django 支持这些复合主键。这里有很多细节需要了解,但如果做得好,它将为数据建模带来更大的灵活性和潜在的简单性。
当前状态
当前状态是该问题已被接受/分配并正在处理中,在 http://github.com/dcramer/django-compositepks 有部分实现。该实现允许具有复合主键。但是,ForeignKey 和 RelatedManager 中缺少对复合键的支持。因此,无法从具有复合主键的模型中导航关系。
讨论:
David Cramer's initial patch
The composite foreign key API design
Ticket
注意 - SqlAlchemy 允许这样做,如下所述,您可以使用 SqlAlchemy 替换 Django 的 ORM
外键也可以在表级别定义,使用 ForeignKeyConstraint 对象。该对象可以描述单列或多列外键。多列外键称为复合外键,几乎总是引用具有复合主键的表。下面我们定义一个具有复合主键的表 invoice:
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'])
)
Reference