sqlalchemy表达式,用于选择父级的父级

时间:2018-07-29 21:45:20

标签: python sqlalchemy flask-sqlalchemy

在ORM模型中,我有三个具有一对多关系的类。如何在孙子类(“登录”)中使用hybrid_property获得祖父母(“角色”)的“名称”属性?

更新: 我在flask-admin视图的'column_list'中使用了新属性'user'。 我尝试使用db.session而不是Sessions,但失败了。我再次尝试了Session(),这次成功了!我本来应该做些傻事。

class Role(db.Model):
    __tablename__  = 'roles'
    id       = db.Column(db.Integer(),  primary_key=True)
    name     = db.Column(db.String(50))
    users    = db.relationship('User')

class User(db.Model):
    __tablename__  = 'users'
    id       = db.Column(db.Integer(),  primary_key=True)
    role_id  = db.Column(db.Integer(), db.ForeignKey('roles.id'))
    role     = db.relationship("Role", back_populates="users")
    logins   = db.relationship('Login')

class Login(db.Model):
    __tablename__  = 'logins'
    id           = db.Column(db.Integer(),  primary_key=True)
    user_id      = db.Column(db.Integer(), db.ForeignKey('users.id'))
    user         = db.relationship("User", back_populates="logins")

    @hybrid_property
    def user(self):
        return self.user.role.name

    @user.expression
    def user(cls):
         ???query = Session().query(Role.name).join(Role.users).filter(User.id==cls.user_id).label('user')
         return query

1 个答案:

答案 0 :(得分:0)

我回答了我的问题,可能会对他人有所帮助。我发现了问题,并找到了一个简单的解决方法。 失败的原因是在登录表View的flask-admin的'column_searchable_list'中具有了hybrid_property'user'。我从列表中删除了它,原始代码起作用了。