查询 SQLAlchemy 的一对多关系

2 投票
1 回答
12485 浏览
提问于 2025-04-18 11:20

我正在尝试根据用户的技能从这些表中查询用户。

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()

撰写回答