又遇到了靈異事件。。Django的ORM。orz.
昨天對Blog的程序進行了優化。見前一篇文章, 因於文章分類允許爲Null導致查詢文章列表時(列表需要顯示分類名)Select_related不起作用引發了1+N問題,所以我把Null= True去掉。減卻了多餘的N條查詢。但是奇怪的事情發生了,我從早上開始發覺,首頁列表的作者變成了Blog的Title。但代碼明明是 {{entry.author.name}}!我改成其他屬性試下,依然是Print出Blog的其他屬性。我回想昨天更新做過的改動,撒銷均無效。最後 想起會不會是因爲改了Model的屬性引起的,於是我把分類的Null=True加上。果然!顯示正常了。這是爲什麼呢?不解!緩存?沒可能吧?
我是不可能再把分類的Null=true保留的,因爲實踐證明這樣對性能損耗太大。但不加上又出現屬性值錯亂的情況。怎麼辦?最後我作了個嘗試,我把Model裏面的屬性調換了一下位置,原來Author在Catelog下方:
catelog = models.ForeignKey(Catelog,verbose_name='分類')
author = models.ForeignKey(Account,verbose_name='作者')
現在改回來,Author寫在Catelog上方。顯示正常。My god!
author = models.ForeignKey(Account,verbose_name='作者')
catelog = models.ForeignKey(Catelog,verbose_name='分類')
這是我的程序的Bug?還是Django的Bug?還是我的Bug?我想這個解決的辦法不是好辦法。
我拿到三種情況的Sql。一是分類爲Null的查詢,二是分類爲NotNull的查詢,三是分類爲NotNull且Author屬性排在 Catelog前面的查詢。結果是第一和第三種情況blog_account_name所在的列位置是一樣的。這是否說明Django的確是記住查詢結果 的位置並且緩存起來了?但緩存到哪裏了呢?如果刷新呢?
原因追尋中。原文見:http://www.fallever.com/blog/jeff/17/