flask-sqlalchemy中用于多对多关系的多帮助表

时间:2019-04-06 20:06:48

标签: python flask sqlalchemy flask-sqlalchemy

许多问题涉及许多问题,可以使用帮助表来解决。但是,很多很多呢...如果存在一种更优雅的方式来解决此问题。

我试图在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

也许我的想法是完全错误的。我应该使用老式的方法来解决问题。

0 个答案:

没有答案