таблица нескольких помощников для отношений многие-многие-многие -... в фляге-sqlalchemy - PullRequest
1 голос
/ 06 апреля 2019

Многие вопросы касались многих проблем, которые можно было бы решить с помощью вспомогательной таблицы.Но как насчет многих-многих-многих ... Если бы существовал более изящный способ решения этой проблемы.

Я пытался поставить вопрос на 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

Возможно, моя идея была совершенно неверной.Я должен использовать метод старой школы, чтобы решить эту проблему.

...