在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中实现这一目标?