修正django admin raw_id_fields bug

Note: 上午还说 最近更新可能会比较缓慢的 ,结果下午就又上来发了一篇,我自己也很囧啊……

Django Admin中使用ForeignKey是一个比较痛苦的事, 默认使用的是 Select 在数据量比较大的情况下要选中需要选择的对象实在是太难了…… 最近刚刚好又碰到了这个问题,为了图方便,干脆就祭起了 raw_id_fields 这个属性来把外键的选择简化为直接输入id。

可是使用下来出现了问题,如果输入的id无效,Django并不会返回期望的包含错误信息的form,而是直接报了个 django.template.TemplateSyntaxError 的错误。情况很奇怪,FK使用的是 ModelChoiceField ,理论上对无效id的错误已经做了捕捉,那问题到底出在什么地方呢?

继续阅读

django安全更新

日Django发布了1.1.1,主要是为了修正一个安全漏洞。

在Django的form中,有一些field使用了正则表达式来验证有效性,比如EmailField和URLField。但是这个正则表达式存在缺陷,会在特定输入下出现服务器端失去响应并耗费大量CPU资源的情况,所以可以被用作恶意攻击服务器的手段。

解决办法有两种,如果你正在使用1.0版、1.1版、或者是SVN版,可以按照下面几个变更集打补丁:

  • Django development trunk: 11603.
  • Django 1.1 release series: 11604.
  • Django 1.0 release series: 11605.

如果你没有对1.1或1.0做过hack,则推荐你更新版本至新发布的1.1.1(download | checksums)和1.0.4(download | checksums)。

Django数据库聚合bug

是周一写的一条笔记:

下午搞Django,一直得不到正确结果。看了半天觉得大约是Django的一个bug吧……对queryset做annotate的时候,如果有了太多的inner join,那么annotate的表会被django弄错。比如对一个queryset做annotate(count = Count('records'))的时候,对于同一张表Django的ORM做了两次内联,然后在做Count的时候,是针对的第一次内联的表,而事实上只有对第二次内联才会有效。今天已经头晕了,等空了做一个干净的试验项目重现错误试试。至于重现后么,要么给Django提个ticket,要么自己先看看怎么弄吧。不过从来没有看过这一层的代码,自己弄如果想短期内弄完估计够呛……

昨天创建了一个小项目,重现了这个错误,然后就到Django Trac上提交了一个ticket。谁知,隔会儿上去看状态时就发现已经被close了。原因是和之前的一个ticket重复了。于是顺藤摸瓜跑去观察了一下,结论是,暂时对于多表的聚合问题,要么就“don't do it”,要么就用点别的办法吧。至于1.2会不会解决这个问题么,我暂时就不抱希望了。

Updated 2009-09-27 16:31:

我很感激Django保留了让我直接执行SQL的能力……