我的評註寫在最下面,如果你懶得看完全文,請一定要去看一下最末的結論。

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 的時候了。

Posted by yungyuc at 20:46, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "WgRxe"
© hover year to navigate month: powered by django