我有下表:
Base = declarative_base()
metadata = Base.metadata
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(255))
email = Column(String(255))
是否可以获取一个字典,对于空记录将返回类似以下内容:
{'id': None, 'username': None, 'email': None}
如果我这样做:
user = User()
user.username = "testuser"
user.email = "[email protected]"
我希望能够获取具有相应值的字典。当然,如果我保存记录,我希望它也有
id
。
您可以利用
user.__table__.columns
:
def get_model_dict(model):
return dict((column.name, getattr(model, column.name))
for column in model.__table__.columns)
用途:
user = User()
get_model_dict(user)
还有其他选项:
在大多数情况下,列名称适合他们。 但也许你写的代码如下:
class UserModel(BaseModel):
user_id = Column("user_id", INT, primary_key=True)
email = Column("user_email", STRING)
column.name“user_email”而字段名称为“email”, column.name 无法像以前那样正常工作。
还有一个使用Python元类的技巧,示例代码:
您可以使用以下方法,该方法受到alecxe给出的答案的启发。
def get_model_dict(model, row):
if isinstance(row, model):
columns = [x.name for x in list(model.__table__.columns)]
return {x: getattr(row, x) for x in columns}
else:
raise ValueError(f"The provided row is not of type {model.__table__.name.title()}")
现在您所要做的就是传递模型和相同模型的行来获取数据的字典表示。
就是这样。
getattr(User, 'id')