查询一对多关系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'

哪里我错过了?

定义以下类方法:

@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在string类上没有skill属性,因此出现错误。

filter函数实际上接受一个Criteria对象。换句话说,你传递给它的不是像"filter"这样的值,而是一个代表"技能表中的技能列必须等于‘nunchuk’"概念的标准。您可以使用以下语法来完成此操作:

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

最新更新