我想尝试构建一个包含多个相关模型的示例,就像以下所示。我们有一个模型B,它与模型C具有1:n的关系;然后我们有一个模型A,它与B有n:1的关系,并且与C也有n:1的关系。(C具有2列主键)
我尝试了这段代码:
但是什么都没有改变。 我是不是错了什么,还是这是一个错误?(至少,错误信息不正确...)
我尝试了这段代码:
class C(db.Model):
__tablename__ = 'C'
key1 = Column(Integer, primary_key=True)
key2 = Column(Integer, primary_key=True)
attr1 = Column(Date)
attr2 = Column(Boolean)
related_b = Column(Integer, ForeignKey('B.spam'))
class B(db.Model):
__tablename__ = 'B'
spam = Column(Integer, default=1, primary_key=True)
eggs = Column(String, default='eggs')
null = Column(String)
n_relation = relationship(C, foreign_keys='C.related_b')
class A(db.Model):
__tablename__ = 'A'
foo = Column(String, default='foo', primary_key=True)
bar = Column(String, default='bar', primary_key=True)
baz = Column(String, default='baz')
rel = relationship(B, foreign_keys='A.related_b')
related_b = Column(Integer, ForeignKey('B.spam'))
related_c1 = Column(Integer, ForeignKey('C.key1'))
related_c2 = Column(Integer, ForeignKey('C.key2'))
other_rel = relationship(C, foreign_keys=(related_c1, related_c2))
只是为了获得异常:
sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship A.other_rel - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
但是,我已经传递了那个参数。 我尝试了各种版本的该参数,通过名称指定A列、C列,通过直接引用指定C列,但似乎都没有影响这个错误。 我还尝试使用单个复合外键,像这样:
class A(db.Model):
__tablename__ = 'A'
foo = Column(String, default='foo', primary_key=True)
bar = Column(String, default='bar', primary_key=True)
baz = Column(String, default='baz')
rel = relationship(B, foreign_keys='A.related_b')
related_b = Column(Integer, ForeignKey('B.spam'))
related_c1 = Column(Integer, ForeignKey('C.key1'))
related_c2 = Column(Integer, ForeignKey('C.key2'))
compound = ForeignKeyConstraint(('related_c1', 'related_c2'), ('C.key1', 'C.key2'))
other_rel = relationship(C, foreign_keys=compound)
但是什么都没有改变。 我是不是错了什么,还是这是一个错误?(至少,错误信息不正确...)
related_b
并不必要,因为related_c
也会确定A与哪个B相关联。(顺便说一句,更有意义的对象名称可能能更好地传达你的意图。) - undefined