【发布时间】:2019-09-29 17:07:44
【问题描述】:
我使用 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 个项目的列表(它返回所有拥有该技能的候选人),效果很好,但如果我在输入列表中添加更多技能(即使我有符合标准的候选人)
【问题讨论】:
-
您能否在查询中显示
constraint_item_candidate和constraint_item_candidate.c的确切含义? -
我的错误,这是一个错字。
constraint_item_candidate实际上是skill_candidate,即 Skill 和 Candidate 的关联表。 Skill_candidate.c 是访问db.Table实例的列字段的方式 -
你需要关系除法/“for all”,意思是“不存在技能 id 不存在于 Skill_candidate”。一些例子:stackoverflow.com/questions/49438529/…、stackoverflow.com/questions/42673699/…
-
非常棒的精确定位,但我不能完全理解那个双重否定......我会在处理它后立即尝试写一个表达式
-
我以为我有它,我尝试先发送原始查询:
SQL select * from SkillCandidate where not (exists (select * from SkillCandidate where SkillCandidate.skill_id not in (1, 2)))但它导致返回一个空结果(1 和 2 是所需技能的 id)
标签: python sqlalchemy flask-sqlalchemy