请教众大神,关于Flask-SQLAlchemy的一个问题

2013-10-14 15:50:04 +08:00
 shanks
目前在用Flask重写wordpress的后端API,读取已有的wordpress数据库。
遇到一个问题,比如说GET /posts 这个请求,希望能返回json格式数据如
{
{
type: 'post'
title: 'XXX'
excerpt: 'xxxxxxxxxxxxxxx....'
..
},
..
}

然后,excerpt呢,本身数据库中是存在这个字段的,但是是空的。所以我想直接取content字段的前100字节用作excerpt。用SQL表达就是

select type as POST_TYPE, title as POST_TITLE, left(content, 100) as POST_EXCERPT,... from wp_posts where type='post' order by post_date limit 20;

models.py基本完成了,定义Class Post,该有的Column都有,但是excerpt这个不知道该如何处理,大概知道是用 @property 装饰器定一个数据处理的属性,但是具体实现实在没有头绪。

即问题可以总结为:如何在SQLAlchemy的数据表定义中定义一个属性,把数据取出来之后经过字符串处理再返回。这个在model层面应该可以解决吧?
3277 次点击
所在节点    Python
7 条回复
linnchord
2013-10-14 17:15:01 +08:00
严格来说这是业务逻辑,不是数据model该干的事。

从简单实现来讲,你可以

_excerpt = Column(u'excerpt', VARCHAR(length=100))

@property
def excerpt(self):
return self._excerpt or self.content[:100]

@excerpt.setter
def excerpt(self, val):
self._excerpt = val
jokaye
2013-10-14 18:46:41 +08:00
@linnchord 点赞
shanks
2013-10-14 19:49:43 +08:00
@linnchord 好顶赞!竟然这么简单!我的Python基础真是弱爆了啊摔 _(:3」∠)_
setter 还有这装饰器?

话说不放在model的话应该放在哪?
zjwzszh
2013-10-14 22:10:39 +08:00
可以放在 model里的,只是你要做好区分,不能一股脑放进去,或者你另外写一个helper类,来操作业务
linnchord
2013-10-14 22:44:08 +08:00
严格来说数据模型和业务模型应该分离,最简单,最简单方式你可以建一个业务model来继承数据model。

不过如果代码规模不大,业务不复杂也不用讲究这么多了,你只是做wp接口,那都揉在一起也关系不大。

http://docs.python.org/2/library/functions.html#property
dzhou121
2013-10-28 16:32:07 +08:00
用content[:100]效率不高,因为SQL会返回content的全部值,也可以用func.left

from sqlalchemy.sql.expression import func

post = session.query(func.left(Post.content, 100))

对应的SQL是

select left(post.content, 100) from post;
shanks
2013-10-28 19:12:44 +08:00
@dzhou121 原本我也这么想,但是发现需要先把所有数据取出来,用 re module做简单的tag过滤,再取100字节。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/85552

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX