2012-07-08 90 views
1

我正在学习sqlalchemy,不知道我是否完全掌握它(我更习惯于手写查询,但我喜欢抽象查询和获取对象的想法)。我经历的教程,并试图将其应用到我的代码,冲进这部分定义模型时:我可以为不同视图创建查询语句吗?

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

它非常有用,因为我可以只搜索用户名,并得到大约只有用户信息我想要的但有没有办法让我可以调用这些类型的视图中的多个?还是我用它错了,应该写一个特定的查询来获取不同视图的不同数据?

为什么我要求我的网站有不同的模板,大多数网页只需要用户名,名字/姓氏,但有些网页需要诸如Twitter或Facebook网址(模型中的字段)等内容。

回答

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)时,将不会加载photoexcerpt列,直到从代码访问为止,此时将执行针对数据库的另一个查询以加载missi ng数据。
但是,如果您在查询Book之前知道立即需要列photo,那么仍可以用undefer选项覆盖延迟行为:query = session.query(Book).options(undefer('photo')).get(1)

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

另一种方法是只查询某些列,但在这种情况下,你所得到的tuple实例,而不是模型实例(在你的情况User),所以它是表格填写潜在OK,但不是那么好模型验证:session.query(Book.id, Book.title).all()

相关问题