使用Flask-SQLAlchemy创建基本表格
我有点困惑,关于如何用Flask-SQLAlchemy创建表格——我在其他地方找到的例子似乎使用了不同的初始化方法(比如,使用Base),而不是下面这个。
db = SQLAlchemy(app)
migrate = Migrate(app, db)
# Define models
roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
nickname = db.Column(db.String(255))
favcolor = db.Column(db.String(255)) #FAVS
favshape = db.Column(db.String(255)) #FAVS
favflower = db.Column(db.String(255)) #FAVS
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
def __str__(self):
return '<User id=%s email=%s>' % (self.id, self.email)
基本上,假设我想把所有的fav
变量(favcolor
、favshape
和favflower
)放在一个叫favorites
的单独表格里。
我该如何确保可以通过主键访问这些收藏的内容呢?
这看起来很简单!希望有个简单的方法可以做到这一点……
1 个回答
0
创建一个叫做'UserFavorites'的模型,这个模型和用户之间是一对一的关系。
class UserFavorites(db.Model):
user_id = db.Column(db.Integer, db.ForeignKey(User.id), primary_key=True)
color = db.Column(db.String, nullable=False, default='')
shape = db.Column(db.String, nullable=False, default='')
flower = db.Column(db.String, nullable=False, default='')
user = db.relationship(User, backref=db.backref('favorites', uselist=False))
在创建用户的同时,也要创建一个UserFavorites的实例。
user = User(email='example@example.com', favorites=UserFavorites(color='green'))
db.session.add(user)
db.session.commit()
user = User.query.filter(
User.email == 'example@example.com'
).options(
db.joinedload(User.favorites)
).one()
print user.favorites.color
你可以通过这个关系来查询用户的收藏。
likes_green = User.query.join(User.favorites).filter(
UserFavorites.color == 'green'
).all()
print [u.email for u in likes_green]