我不清楚如何为以下场景配置SQLAlchemy:
notes
表格notes
表,为所有其他表提供服务,其关系基于parent_type
表中的notes
列
例如:如果relation_type
是项,则relationship_id
指的是table_items
表的PK。如果relation_type
订单,则relationship_id
会引用table_orders
的PK
答案 0 :(得分:2)
IMO,您描述的问题最好使用Generic Associations示例解决
三个examples listed中最接近的示例是discriminator_on_association.py
答案 1 :(得分:1)
要回答您的确切问题(我认为),您可以在每个指定主要条件的模型上建立关系,但您将无法管理外键关系_id的完整性。 Order模型上的这种关系可能如下所示:
notes = relationship('Note', backref="order", primaryjoin="and_(Note.relationship_id == Order.id, relationship_type == 'orders')")
但是为了保持外键的完整性,我建议采用两种方法之一。首先,您可以使用单表继承并将所有fk放在注释表中,如:
id INT
relationship_type VARCHAR
item_id INT REFERENCES items.id
orders INT REFERENCES orders.id
objects INT REFERENCES objects.id
然后你可以做一些像雇员,经理等例子,但是对于item_notes,order_notes和object_notes:
http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance.html#single-table-inheritance
第二种方法是在每个可以有笔记的表中放置一个外键。外键将指向表示一组注释的新表。
特别是在这种情况下,您需要在items,orders和objects表中添加note_group_id列。然后创建一个新表note_groups并在notes表中创建一个note_group_id列。
然后,如果需要,note_groups表可以具有引用项目,订单或对象的类型列。您可以通过将类型添加到relationship()的primaryjoin参数来提高一对一关系的准确性。关系的完整性不是很好,但我认为简单的说明就足够了。
note_group = relationship('NoteGroup', uselist=False, backref="item", primaryjoin="and_(Item.note_group_id == NoteGroup.id, NoteGroup.type == 'items')")
对于第二种方法,您不需要继承,它只是一对一的关系(从任何可以注释到note_groups表的表)和从note_groups表到notes表的一对多关系。 / p>
还有更多方法,但我认为这是最简单的两种方法。希望其他人有更多的建议。