關於Django的ORM

又遇到了靈異事件。。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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章