Python Sqlalchemy选择条件

Python Sqlalchemy选择条件,python,sqlalchemy,Python,Sqlalchemy,我在一个表上有一个映射器,我想定义一个列_属性,无论实体是否具有某些属性,它都应该选择True或False: mapper( Person, persons_table, properties = { 'administrator': column_property( select( [True if roles_table.c.is_admin or roles_table.c.id == 1 else False],

我在一个表上有一个映射器,我想定义一个列_属性,无论实体是否具有某些属性,它都应该选择True或False:

mapper( Person, persons_table, properties = {
    'administrator': column_property( 
        select( 
            [True if roles_table.c.is_admin or roles_table.c.id == 1 else False],
            roles_table.c.id == persons_table.c.role_id
        ).label( 'administrator' )
        )
} )

这是我能做的吗?我对这一部分更感兴趣:
[如果角色\u table.c.是\u admin或角色\u table.c.id==1,则为True],
,它允许我根据条件为列设置一个值。

您的选择表达式实际上是一个Python表达式:

select([True if roles_table.c.is_admin or roles_table.c.id == 1 else False],
       roles_table.c.id == persons_table.c.role_id)
sqlalchemy.select()
将看到以下内容:

select([True], some_expression_object)
由于列对象
roles\u table.c.is\u admin
将在布尔上下文中计算为
True
。我不知道SQLAlchemy将如何解释这一点,但它肯定不会如您所愿工作

您必须重写此表达式,使其对应于普通SQL,而不是使用
if。。。否则…

column_property(
    select([case([(roles_table.c.is_admin, 1),
                  (roles_table.c.id == 1, 1)], else_=0)],
           roles_table.c.id == persons_table.c.role_id))
然而,在您的情况下,可能有一个更简单的解决方案<代码>人和
角色
似乎有一种
N:1
关系(一个人正好有一个角色)。我假设有一个
orm.relationship
Person.role
来获取一个人的角色

为什么不添加一个普通Python属性:

class Person:
    # ...

    @property
    def administrator(self):
        return self.role and (self.role.is_admin or self.role.id == 1)

它必须是bw,因为它是一个列属性。你和炼金术一起工作过吗?