Django的第一印象


        Django (/ˈdʒæŋgoː/) 是用python語言寫的開源web開發框架(open source web framework),鼓勵快速開發,並遵循MTV設計模式。其主要目的是簡便、快速的開發數據庫驅動的網站。

        Django遵守 BSD版權,目前最新的穩定版(stable)是2011年9月發布的v1.3.1。

        Django 的名稱來源於比利時的爵士音樂家Django Reinhardt,他是一個吉普賽人,主要演奏吉它。

 

        與rails一樣,Django強調 松耦合少寫代碼快速開發DRY一致性等原則。但Django與rails在設計哲學上最大的不同在於,Django強調“顯示說明優於隱含意義”,這一點來自於Python的核心原則。

       這一設計哲學的不同使得Django與rails有很大的不同:Django不喜歡“魔術代碼”。盡管魔術代碼看起來很酷,但是存在着如下問題:

       1)語法晦澀難懂,除了編程語言外,你還需要了解一門自定義的DSL
       2)相對於編程語言,DSL更加不穩定,可能會經常變化
       3)如果你想理解其實現方式,需要花費比較大的精力
       4)魔術代碼可以很容易地實現某些特定的功能,但是如果你想在此基礎上做一些改變,就會變得非常困難
所以,Django不喜歡“魔術代碼”,而是強調代碼的可理解、可控制

      比如《Agile Web Development with Rails》中開篇用來吸引人的那個例子,一個關於項目的Model類:

class Project < ActiveRecord::Base
         belongs_to :portfolio
         has_one :project_manager
         has_many :milestones
         has_and_belongs_to_many :categories
         
         validates_presence_of :name, :description
         validates_acceptance_of :non_disclosure_agreement
         validates_uniqueness_of :key
end

 

       看上去很神奇對嗎?但是你馬上就會提出幾個問題:

       1)除了關聯關系外,對象自身的屬性在哪里定義?

       2)non_discolosure_agreement是什么屬性?

       3)validates_xxx 之類的語法到底有多少種?

       ...

      本文並不是以介紹rails為主,所以上述問題在這里不作回答。但是為了與Django的Model對比,還需要補全rails 模型的另外一個部分:migration。事實上,在rails中,上面的Model還需要一個db migrate 類一起才能工作:

 

class CreateProject < ActiveRecord::Migration
    def change
        create_table :projects do |t|
            t.integer  :portfolio_id
            t.string   :name
            t.text      :description
            ...
        end
   end
end

 
       Django的設計是 以Python類的形式定義數據模型,通過ORM與數據庫聯系起來。同時約定為了避免“猜謎游戲”,不應該僅僅依賴字段的命名來預示其可能的行為,而是通過關鍵的參數來定義操作。

 

       上述Model類在Django中以如下簡單明了的方式來實現:

class Project(models.Model):    

    portfolio    = models.ForeignKey(Portfolio)

    categories  = models.ManyToManyField(Category)
    name           = models.CharField()
    description  = models.TextField()

     #其中has_one, has_many 之類的關系只在對端聲明ForeighKey即可,本端不用聲明,可以直接引用

 

Django的代碼清楚明白,每一條語句都很明確。這就是Django的風格。(順便說一句,Django的靈活性不以犧牲外鍵關聯為代價,而rails的數據庫中不支持外鍵關系)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM