有两个表格,我们称之为Source1
和Source2
,它们都有通常的id
和其他不相关的列。然后有Product
表Source1
,Source2
和Product
都有外键,两个外键组成Product
的主键(换句话说,就是一个 - - Source1
与Source2
和MultiProduct
的笛卡尔积之间的关系。然后是另一个表Source1
,同时拥有Source2
和
class Source1(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# ...
class Source2(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# ...
class Product(db.Model):
source1_id = db.Column(db.Integer, db.ForeignKey('Source1.id'), primary_key=True)
source2_id = db.Column(db.Integer, db.ForeignKey('Source2.id'), primary_key=True)
multis = db.relationship('MultiProduct', ...) # 1) what goes here?
# ...
class MultiProduct(db.Model):
source1_id = db.Column(db.Integer, db.ForeignKey('Source1.id'), primary_key=True)
source2_id = db.Column(db.Integer, db.ForeignKey('Source2.id'), primary_key=True)
extra_id = db.Column(db.Integer, primary_key=True)
product = db.relationship('Product', ...) # 2) what goes here?
的外键;它的主键是外键和第三个字段的组合。在flask-sqlalchemy的声明性语言中,到目前为止的模式如下所示:
Product
这实质上导致MultiProduct
和Product
处于一对多的关系中,这是我正在努力描述的关系 - 我希望MultiProduct
拥有MultiProduct
个对象列表和Product
个
multis = db.relationship("MultiProduct", backref='product', uselist=True,
primaryjoin="and_(Product.source1_id==MultiProduct.source1_id,"
"Product.source2_id==MultiProduct.source2_id)",
foreign_keys=[source1_id, source2_id])
个对象 - 标有“什么在这里”的行对我来说不是很清楚。关于如何执行此操作以及如何简化数据库架构的建议均值得赞赏。
我的尝试一直是
__table_args__
有或没有
__table_args__ = (
db.ForeignKeyConstraint(
['source1_id', 'source2_id'],
['MultiProduct.source1_id', 'MultiProduct.source2_id'],
),
)
:
Product
在MultiProduct
和Product(multis=[MultiProduct(...)])
中的任意一个/两个中(具有正确的相应表名)。在执行MultiProduct
时,我得到一个例外,说source1_id
的{{1}}为空,违反约束,即“子”MultiProduct
无法从父级获取ID 。
对此进行建模的正确方法是什么?我的数据库架构从一开始就是次优的吗?