查询一对多关系SQLAlchemy

时间:2014-06-27 14:57:21

标签: python flask-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 个答案:

答案 0 :(得分:5)

您可以定义以下类方法:

@classmethod
def users_by_skill(cls, skill):
    return User.query.join(Skill).filter(skill.skill).all()

您可能希望像这样使用此功能:

users = Users.users_by_skill('nunchuk')

这意味着skill中的users_by_skill参数是一个字符串。然后,您尝试使用skill.skill,这基本上就像在执行'nunchuk'.skill一样。 Python在字符串类上没有skill属性,因此出错。

filter函数实际上需要Criteria个对象。换句话说,你没有传递"filter"这样的值,而是传递一个代表&#34的概念的标准;技能表上的技能栏必须等于' nunchuk& #39;&#34 ;.您可以使用以下语法执行此操作:

@classmethod
def users_by_skill(cls, skill_name):
    return User.query.join(Skill).filter(Skill.skill == skill_name).all()