0

我正在学习 sqlalchemy,但不确定我是否完全掌握它(我更习惯于手动编写查询,但我喜欢抽象查询和获取对象的想法)。我正在阅读本教程并尝试将其应用到我的代码中,并在定义模型时遇到了这一部分:

def __repr__(self):
    return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

它很有用,因为我可以只搜索用户名并仅获取有关我想要的用户的信息,但是有没有办法让我可以调用多个此类视图?还是我用错了,应该编写一个特定的查询来为不同的视图获取不同的数据?

为什么我要求我的网站有不同的模板的一些上下文,大多数页面只需要用户名、名字/姓氏,但有些页面需要 twitter 或 Facebook url(也是模型中的字段)之类的东西。

4

1 回答 1

2

首先,__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
Bookphotoquery = session.query(Book).options(undefer('photo')).get(1)

基本上,这里的建议是推迟所有列(在您的情况下:除了用户名、密码等),并在每个用例(视图)中覆盖undefer您知道该特定视图所需的列。另请参阅 的group参数deferred,以便您可以按用例(视图)对属性进行分组。

另一种方法是仅查询某些列,但在这种情况下,您获取的是tuple实例而不是模型实例(在您的情况下User),因此可能可以填写表单,但对于模型验证不太好:session.query(Book.id, Book.title).all()

于 2012-07-09T12:59:36.910 回答