gpt4 book ai didi

python - 列表属性上的 SQLAlchemy 过滤器

转载 作者:行者123 更新时间:2023-11-28 20:54:59 24 4
gpt4 key购买 nike

我使用 Flask-SQLAlchemy 定义了以下模型:

"""models.py"""

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

skill_candidate = db.Table(
'SkillCandidate',
db.Column('skill_id', db.String, db.ForeignKey('skill.id')),
db.Column('candidate_id', db.Integer, db.ForeignKey('candidate.id')))

class Candidate(db.Model):
id = db.Column(db.Integer, primary_key=True)
skills = db.relationship("Skill", secondary=skill_candidate)

class Skill(db.Model):
id = db.Column(db.String, primary_key=True)
name = db.Column(db.String, nullable=False, unique=True)

我正在努力实现以下目标:我想返回所有拥有列表输入中提供的技能的候选人(甚至理想情况下,一个 skill_id 列表)

我尝试了以下方法:

def get_skilled_candidates(skill_ids):
return Candidate.query.join(skill_candidate).\
filter(and_(*[skill_candidate.c.skill_id == skill_id for skill_id in skill_ids])).\
all()

目的是过滤所有候选人的每项技能,并用 and_ 语句组合

如果我使用包含 1 个项目的列表(它返回所有拥有该技能的候选人),效果很好,但如果我在输入列表中添加更多技能,则效果不佳(即使我在基础中有符合条件的候选人)

最佳答案

您可以查询具有列表中任何技能的所有候选人,然后使用列表理解筛选结果。这可能不如 @IljaEverilä 提到的关系划分方法那样高效。 ,但它确实简化了查询方面。

skill_ids = ['id_1', 'id_2']
candidates = session.query(Candidate).\
filter(Candidate.skills.any(Skill.id.in_(skill_ids)).\
all()

candidates = [
c for c in candidates
if set(s.id for s in c.skills).issuperset(skill_ids)
]

关于python - 列表属性上的 SQLAlchemy 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58080691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com