首先,__repr__
它不是一个视图,所以如果你有一个User
带有定义列的简单模型,并且你查询 a User
,所有的列都将从数据库中加载,而不仅仅是那些在__repr__
.
让我们以模型Book
(来自后面提到的示例)为基础:
class Book(Base):
book_id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False)
summary = Column(String(2000))
excerpt = Column(Text)
photo = Column(Binary)
跳过加载某些列的第一个选项是使用Deferred Column Loading:
class Book(Base):
# ...
excerpt = deferred(Column(Text))
photo = deferred(Column(Binary))
在这种情况下,当您执行 query 时session.query(Book).get(1)
,在从代码访问之前不会加载photo
和列,此时将执行针对数据库的另一个查询以加载丢失的数据。
但是,如果您在查询之前知道您需要立即使用该列,您仍然可以使用 undefer 选项覆盖延迟行为:excerpt
Book
photo
query = session.query(Book).options(undefer('photo')).get(1)
基本上,这里的建议是推迟所有列(在您的情况下:除了用户名、密码等),并在每个用例(视图)中覆盖undefer
您知道该特定视图所需的列。另请参阅 的group
参数deferred
,以便您可以按用例(视图)对属性进行分组。
另一种方法是仅查询某些列,但在这种情况下,您获取的是tuple
实例而不是模型实例(在您的情况下User
),因此可能可以填写表单,但对于模型验证不太好:session.query(Book.id, Book.title).all()