Ped*_*eck 29 python sqlalchemy flask-sqlalchemy
我有两个Flask-SQLAlchemy模型,具有简单的一对多关系,如下面的最小示例:
class School(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
address = db.Column(db.String(30))
class Teacher(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30))
id_school = db.Column(db.Integer, db.ForeignKey(School.id))
school = relationship('School', backref='teachers')
Run Code Online (Sandbox Code Playgroud)
然后我向使用该关系的教师添加混合属性,如:
@hybrid_property
def school_name(self):
return self.school.name
Run Code Online (Sandbox Code Playgroud)
当我使用它时,该属性工作得很好teacher_instance.school_name.但是,我也想提出类似的查询Teacher.query.filter(Teacher.school_name == 'x'),但这给了我一个错误:
`AttributeError: Neither 'InstrumentedAttribute' object nor
'Comparator' object has an attribute 'school_name'`.
Run Code Online (Sandbox Code Playgroud)
在SQLAlchemy文档之后,我添加了一个简单的混合表达式,如下所示:
@school_name.expression
def school_name(cls):
return School.name
Run Code Online (Sandbox Code Playgroud)
但是,当我再次尝试相同的查询时,它会生成一个没有join子句的SQL查询,因此我获得了School中所有可用的行,而不仅仅是那些与Teacher中的外键匹配的行.
从SQLAlchemy文档中我意识到表达式需要一个已经存在连接的上下文,所以我再次尝试查询:
Teacher.query.join(School).filter(Teacher.school_name == 'x')
这实际上是有效的,但是如果我需要学校模型的知识来实现这一目的,那就首先试图在那里试图获得语法糖.我希望有一种方法可以在表达式中加入,但我无法在任何地方找到它.该文档有一个示例,表达式返回一个直接用它构建的子查询select(),但即使这对我没用.
有任何想法吗?
UPDATE
在下面的Eevee回答之后,我使用了建议的关联代理并且它有效,但我也对它应该与select()子查询一起工作的评论感到好奇,并试图弄清楚我做错了什么.我最初的尝试是:
@school_name.expression
def school_name(cls):
return select(School.name).where(cls.id_school == School.id).as_scalar()
Run Code Online (Sandbox Code Playgroud)
事实证明这是错误的,因为我错过了select()中的列表.下面的代码工作正常:
@school_name.expression
def school_name(cls):
return select([School.name]).where(cls.id_school == School.id).as_scalar()
Run Code Online (Sandbox Code Playgroud)
Eev*_*vee 16
对于像这样的简单案例,更简单的方法是关联代理:
class Teacher(db.Model):
school_name = associationproxy('school', 'name')
Run Code Online (Sandbox Code Playgroud)
这支持==自动查询(至少使用).
我很好奇混合动力的select()例子对你不起作用,因为这是在混合动力车中解决这个问题的最简单方法.并且为了完成,您还可以使用变换器直接修改查询而不是子查询.
| 归档时间: |
|
| 查看次数: |
7215 次 |
| 最近记录: |