查询一对多关系SQLAlchemy

ajk*_*hol 1 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')
Run Code Online (Sandbox Code Playgroud)
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'))
Run Code Online (Sandbox Code Playgroud)

我在用户表中尝试了这个并得到了这个错误.

@classmethod
def users_by_skill(cls, skill):
    return User.query.join(Skill).filter(skill.skill).all()
Run Code Online (Sandbox Code Playgroud)
AttributeError: 'str' object has no attribute 'skill'
Run Code Online (Sandbox Code Playgroud)

我错过了哪里?

Mar*_*eth 5

您定义以下类方法:

@classmethod
def users_by_skill(cls, skill):
    return User.query.join(Skill).filter(skill.skill).all()
Run Code Online (Sandbox Code Playgroud)

你可能希望像这样使用这个函数:

users = Users.users_by_skill('nunchuk')
Run Code Online (Sandbox Code Playgroud)

这意味着skill参数in users_by_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()
Run Code Online (Sandbox Code Playgroud)