" has_many:通过"在sqlalchemy中构建

时间:2017-09-21 13:05:30

标签: python flask-sqlalchemy

在rails中,我们可以简单地定义与has_many:through语法的关系,以便访问第2,第3,第n度关系。

然而,在SQLAlchemy中,这似乎更难。我试图避免沿着写连接的路线走下去,因为我发现它们是试图保持干净代码库的反模式。

我的表格如下:

class Message(db.Model):
    __tablename__ = 'message'
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String())
    user_id = db.Column(db.ForeignKey("user.id"))
    user = db.relationship('User', backref="messages")

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String())

class Level(db.Model):
    __tablename__ = 'level'
    number = db.Column(db.Integer, nullable=False, primary_key=True)
    name = db.Column(db.String(), nullable=False, primary_key=True)
    users = db.relationship(
        "User",
        secondary="user_level",
        backref="levels")

class UserLevel(db.Model):
    __tablename__ = 'user_level'
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    number = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(), primary_key=True)

    __table_args__ = (
        db.ForeignKeyConstraint(
            ['number', 'name'],
            ['level.number', 'level.name']
        ),
    )

这个想法是用户可以拥有多个授权级别(例如,用户可以同时处于级别1,3和6)。由于我所拥有的数据不包含可用级别的唯一序列号,因此我不得不求助于使用复合键来保持数据与未来的更新保持一致。

要获取某个级别的所有消息,我现在可以执行以下操作:

users = Level.query[0].users
for user in users:
    results.append(user.messages)
return results

这给了我一个级别的所有用户。但是为了获得某个级别的所有消息,我必须遍历这些用户并将它们附加到结果列表中。

我想做的是:

return Level.query[0].users.messages

这更像是我习惯使用rails的语法。如何在flask-SQLAlchemy中实现这一目标?

0 个答案:

没有答案