Многие вопросы касались многих проблем, которые можно было бы решить с помощью вспомогательной таблицы.Но как насчет многих-многих-многих ... Если бы существовал более изящный способ решения этой проблемы.
Я пытался поставить вопрос на 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
Возможно, моя идея была совершенно неверной.Я должен использовать метод старой школы, чтобы решить эту проблему.