我一直在尝试如何遍历SQLAlchemy模型中定义的列列表。我需要它来编写一些序列化和复制方法到几个模型。我不能只遍历obj.__dict__
,因为它包含许多SA特定的项。
有没有人知道从下面得到id
和desc
名称的方法?
class JobStatus(Base):
__tablename__ = 'jobstatus'
id = Column(Integer, primary_key=True)
desc = Column(Unicode(20))
在这种小情况下,我可以轻松创建:
def logme(self):
return {'id': self.id, 'desc': self.desc}
但我更喜欢自动生成dict
(用于较大的对象)。
我意识到这是一个老问题,但我遇到了同样的要求,我想为未来的读者提供一个替代的解决方案。
正如Josh所指出的,完整的SQL字段名将由
JobStatus.__table__.columns
返回,因此您将得到jobstatus.id而不是原始字段名。没那么有用。获取最初定义的字段名列表的解决方案是查看包含完整数据的column对象的
_data
属性。如果我们看一下JobStatus.__table__.columns._data
,它看起来是这样的:从这里您可以简单地调用
JobStatus.__table__.columns._data.keys()
,这给了您一个很好的、干净的列表:您可以使用以下函数:
它将排除SAmagic属性,但不排除关系。所以基本上它可能会加载依赖项、父项、子项等,这绝对是不可取的。
但实际上要容易得多,因为如果从
Base
继承,就有一个__table__
属性,这样就可以:见How to discover table properties from SQLAlchemy mapped object-类似问题。
由Mike编辑:请参阅Mapper.c和Mapper.mapped_table等函数。如果使用0.8或更高版本,请参见Mapper.attrs和相关函数。
例如Mapper.attrs:
可以从映射器中获取已定义属性的列表。对于您的情况,您只对ColumnProperty对象感兴趣。
相关问题 更多 >
编程相关推荐