我正在学习sqlalchemy并且不确定我是否完全掌握它(我更习惯于手工编写查询但我喜欢抽象查询和获取对象的想法)。我正在阅读本教程,并尝试将其应用于我的代码,并在定义模型时遇到了这个部分:
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
它非常有用,因为我可以只搜索用户名并获取有关我想要的用户的信息,但有没有办法让我可以调用多种这类视图?或者我使用它是错误的,应该编写一个特定的查询来获取不同视图的不同数据?
为什么我要求我的网站有不同的模板,大多数页面只需要用户名,名/姓,但有些页面需要twitter或Facebook网址(也是模型中的字段)。< / p>
答案 0 :(得分:2)
首先,__repr__
不是一个视图,因此,如果您有一个带有已定义列的简单模型User
,并且您查询了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))
在这种情况下,当您执行查询session.query(Book).get(1)
时,在从代码访问之前不会加载photo
和excerpt
列,此时将执行针对数据库的另一个查询加载缺失的数据
但是,如果您在查询Book
之前就知道需要立即使用列photo
,则仍然可以使用“未更改”选项覆盖延迟行为:query = session.query(Book).options(undefer('photo')).get(1)
。
基本上,这里的建议是推迟所有列(在您的情况下:除了用户名,密码等),并在每个用例(视图)覆盖undefer
您知道的那些你需要特定的观点。另请参阅group
的{{1}}参数,以便您可以按用例(视图)对属性进行分组。
另一种方法是仅查询某些列,但在这种情况下,您将获得deferred
实例而不是模型实例(在您的情况下为tuple
),因此表单可能正常填充,但不太适合模型验证:User