sqlalchemy模型的已定义列上迭代的方法?
我一直在尝试找出如何遍历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
(对于较大的对象)的东西。
-
您可以使用以下功能:
def __unicode__(self): return "[%s(%s)]" % (self.__class__.__name__, ', '.join('%s=%s' % (k, self.__dict__[k]) for k in sorted(self.__dict__) if '_sa_' != k[:4]))
它将排除SA 魔术 属性,但不排除关系。因此,基本上它可能会加载依赖项,父项,子项等,这绝对是不可取的。
但这实际上要容易得多,因为如果您继承自
Base
,则拥有一个__table__
属性,因此您可以执行以下操作:for c in JobStatus.__table__.columns: print c for c in JobStatus.__table__.foreign_keys: print c
请参阅如何从SQLAlchemy映射的对象中发现表属性-类似的问题。
迈克(Mike)编辑:
请参见Mapper.c和Mapper.mapped_table之类的函数。如果使用0.8或更高版本,还请参见Mapper.attrs和相关函数。from sqlalchemy import inspect mapper = inspect(JobStatus) for column in mapper.attrs: print column.key