在写Django Model的Manager面临的一大问题是怎么样才能实现Django Model的复杂查询,比如LEFT JOIN语句的使用,Google用了不少时间,基本上了解大概,总结下,大概有3种方式。
闲话 Django Raw SQL
实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化
写Model的时候参考http://f2m.im的表结构,发现它大量使用了JOIN查询,而且在多个表上都没有使用外键,我想不用外键也是为了方便修改,删除时产生不必要的约束。Django Model实现了ForeignKey,很方便的能查询到外键所在的实例,进一步能查询的更多,但是查询一次相当于执行一次SQL语句,这就造成了性能开销。所以F2E才会使用JOIN语句把计算的过程都交给MySQL。
Django forum,学习Django了,准备写一个论坛,想法是实现一个如 http://f2e.im/ 这样的现代论坛,数据驱动开发,第一步就是设计数据库表结构,Django自带了用户模块,但是定义的字段太少,所以需要自定义扩展下。
在settings.py
下新增自定义用户类:
花了一天时间把RSS Factory更新了下,把Tornado默认的模版引擎换为jinja2,解析html第三方库换为lxml。遇到了几个坑,纪录下。
自动转义
Tornado默认的模版引擎默认自动转义,Flask配置的jinja2也自动转义了,在Tornado中使用jinja2模版引擎的简单方法,按照这个方法模版渲染的时候却没有自动转义,所以还需要进一步配置。
application = tornado.web.Application(
template_loader=JinjaLoader(os.path.join(os.path.dirname(__file__), 'templates/'),
autoescape=True, extensions=['jinja2.ext.autoescape']),
)