许多问题涉及许多问题,可以使用帮助表来解决。但是,很多很多呢...如果存在一种更优雅的方式来解决此问题。
我试图在https://github.com/pallets/flask-sqlalchemy/issues/710上发布一个问题。但是这个人拒绝回答这个问题,或者我认为这是一个功能,而不是问题。但是无论如何,他关闭了我的问题。
这是最小的示例代码,我想以此方式处理A,B,C之间的关系。
Helper_table = db.Table('Helper_table',
db.Column('id_a', db.Integer,
db.ForeignKey('a.id')),
db.Column('id_b', db.Integer,
db.ForeignKey('b.id')),
db.Column('id_c', db.Integer,
db.ForeignKey('c.id'))
)
这里是A,B,C的模型。
class A(db.Model): # A ORM
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
bs = db.relationship(
'B', secondary=Helper_table, lazy='dynamic')
cs = db.relationship(
'C', secondary=Helper_table, lazy='dynamic')
def __repr__(self):
return '<A {}>'.format(self.username)
class B(db.Model): # B ORM
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
as = db.relationship(
'A', secondary=Helper_table, lazy='dynamic')
cs = db.relationship(
'C', secondary=Helper_table, lazy='dynamic')
def __repr__(self):
return '<B {}>'.format(self.username)
class C(db.Model): # C ORM
id = db.Column(db.Integer, primary_key=True)
def __repr__(self):
return '<C {}>'.format(self.id)
这是它们的测试代码。
def test():
s1 = A(username="a1_"+str(uuid.uuid4()))
s2 = A(username="a2_"+str(uuid.uuid4()))
t1 = B(username="b1_"+str(uuid.uuid4()))
t2 = B(username="b2_"+str(uuid.uuid4()))
c1 = C()
c2 = C()
c3 = C()
c4 = C()
t1.as.append(s1)
t1.cs.append(c1)
t1.as.append(s2)
t1.cs.append(c2)
t2.as.append(s1)
t2.cs.append(c3)
t2.as.append(s2)
t2.cs.append(c4)
db.session.add(t1)
db.session.add(t2)
db.session.commit()
第一次想到这个主意。我认为也许上面的代码可以解决问题。不幸的是,运行这些代码后,我发现它并没有按照我的意愿工作。
这是数据库中显示的帮助程序表。不是我所期望的。
https://i.stack.imgur.com/A9i2F.png
也许我的想法是完全错误的。我应该使用老式的方法来解决问题。