我的評註寫在最下面,如果你懶得看完全文,請一定要去看一下最末的結論。
Django 的 magic-removal branch 將在 0.92 裡現身,發行的日子應該不遠了。magic-removal 聽說會有非常巨大的改變,巨大到了我不敢去看有多巨大的程度。好不容易把資料從 COREBlog 轉出來了,如果還要再重寫系統,那可真恐怖。
幸好,實際看了一下說明以後,發現 magic-removal 沒有那麼可怕。除了會把一些功能放到更合理的位置之外,最大的改變就是把原本神奇的 ORM model "module" 正本清源成類別 (class),其它許多改變,其實都和 ORM 的這一點改變有關。
原本的 ORM model module (這真繞口) 是一個非常神奇的東西,我曾經嘗試進行說明,不過真難。module (模組) 在 Python 裡也是一種物件,並且可以直接在程式碼裡面製造出來。這種作法非常不正常,因為一般認知的 Python 模組就是一個 .py 檔,但 Django 裡面自行製造的 ORM model module 卻不存在於磁碟上!
考慮一個 Django app 的 model:
from django.core import meta
class Sample( meta.Model ):
field1 = meta.CharField( "field1", maxlength=32 )
field2 = meta.CharField( "field2", maxlength=32 )
假設取名為 app/models/somemodel.py (app 是 Django app 的名稱),那麼我們在 Django 程式中要使用這個 ORM model 的時候,並不是用:
from app.models.somemodel import Sample
obj = Sample( field1="f1", field2="f2" )
obj.save()
而要用:
from django.models.somemodel import samples
obj = samples.Sample( field1="f1", field2="f2" )
obj.save()
看!在目前的 Django (0.91) 中使用 ORM 的語法,我們所預料中的 Sample, somemodel 全都出現在奇妙的地方,還多了一個完全沒有定義過的 samples (這就是 Django 為我們製造出來的 ORM model module)!真是夠「神奇」了,或者說夠鳥了吧。
不過 magic-removal 會拯救世界。在 magic-removal 中原本放在 app/models/somemodel.py 的檔案,現在要改放到比較合理的 app/models.py 裡面去。內容還是差不多:
from django.db import models
class Sample( models.Model ):
field1 = models.CharField( "field1", maxlength=32 )
field2 = models.CharField( "field2", maxlength=32 )
其實就是把 django.core.meta 改成 django.db.models。使用 ORM 的時候變成:
from app.models import Sample
obj = Sample( field1="f1", field2="f2" )
obj.save()
變得直覺了。
各位,如果要來玩 Django 的話,直接 check out magic-removal branch,不要用 0.91 release 了。依我的感覺,舊的語法難看又古怪;magic-removal 正在往對的方向走,只是 0.91 與 0.92 的差距會讓人覺得有點可怕。然而,0.92 再沒多久就要發行,我想現在是放棄 0.91 的時候了。