V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
shanks
V2EX  ›  Python

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

  •  
  •   shanks ·
    YvesChan · 2013-10-14 15:50:04 +08:00 · 3303 次点击
    这是一个创建于 4088 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前在用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层面应该可以解决吧?
    7 条回复    1970-01-01 08:00:00 +08:00
    linnchord
        1
    linnchord  
       2013-10-14 17:15:01 +08:00   ❤️ 1
    严格来说这是业务逻辑,不是数据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
        2
    jokaye  
       2013-10-14 18:46:41 +08:00
    @linnchord 点赞
    shanks
        3
    shanks  
    OP
       2013-10-14 19:49:43 +08:00
    @linnchord 好顶赞!竟然这么简单!我的Python基础真是弱爆了啊摔 _(:3」∠)_
    setter 还有这装饰器?

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

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

    http://docs.python.org/2/library/functions.html#property
    dzhou121
        6
    dzhou121  
       2013-10-28 16:32:07 +08:00   ❤️ 1
    用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
        7
    shanks  
    OP
       2013-10-28 19:12:44 +08:00
    @dzhou121 原本我也这么想,但是发现需要先把所有数据取出来,用 re module做简单的tag过滤,再取100字节。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:06 · PVG 09:06 · LAX 17:06 · JFK 20:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.