查询 SQLAlchemy 的一对多关系
我正在尝试根据用户的技能从这些表中查询用户。
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
skills = db.relationship('Skill', backref='author', lazy='dynamic')
class Skill(db.Model):
__tablename__ = 'skills'
id = db.Column(db.Integer, primary_key=True)
skill = db.Column(db.String(64), index=True)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
我在用户表中尝试了这个,但出现了这个错误。
@classmethod
def users_by_skill(cls, skill):
return User.query.join(Skill).filter(skill.skill).all()
AttributeError: 'str' object has no attribute 'skill'
我哪里出错了呢?
1 个回答
9
你定义了一个类方法:
@classmethod
def users_by_skill(cls, skill):
return User.query.join(Skill).filter(skill.skill).all()
你可能希望像这样使用这个函数:
users = Users.users_by_skill('nunchuk')
这意味着在 users_by_skill
中的 skill
参数是一个字符串。然后,你尝试使用 skill.skill
,这实际上就像在做 'nunchuk'.skill
。但是,Python 的字符串类并没有 skill
这个属性,所以就会报错。
其实,filter
函数需要的是一个 Criteria
对象。换句话说,你不能直接传一个值,比如 "filter"
,而是要传一个标准,表示“技能表中的技能列必须等于 'nunchuk'”。你可以使用下面这样的语法来实现:
@classmethod
def users_by_skill(cls, skill_name):
return User.query.join(Skill).filter(Skill.skill == skill_name).all()