2010-11-28 33 views
3

如何使用django來組織我的域圖層?Django和域圖層

我知道我可以編寫自定義管理器來保存我的查詢,但是如果我想要更像規範模式更靈活的東西。

是否有任何Django獨有的域模式?

我目前正在設計一個使用Django的大型應用程序,我想知道如何執行域圖層。

回答

5

這個問題有點主觀的,但這裏有我的兩分錢:

  • 在同一時間改變多個對象一般應去經理的業務邏輯。
  • 用於創建對象應在經理特殊的邏輯,認爲計算定製的信息,更新一些複雜的領域,等等MyModel.objects.create_complex(foo, bar)
  • 業務邏輯,應在方法(或屬性)在您的模型,認爲my_instance.get_accumulated_interest()。這些不應該保存模型,只更新一些字段然後返回。
  • 用於驗證信息的業務邏輯應該採用模型上的clean方法或採用特殊形式的clean方法。如果在模型上,它可以更容易地從系統的不同部分重用。
  • 一般來說,如果你找不到合適的邏輯地點,我把它們放在視圖中。
  • 離線處理應該在自定義管理命令中進行,並且您應該可以多次使用相同的參數重新運行相同的命令,而不會產生任何不需要的影響。

當我說「應該進入X」時,我的意思是系統的這些部分應該調用自己的模塊,這些模塊可能與Django完全分開。這可能會更容易孤立地測試這些功能。

編輯:

對於「規範模式」,我建議寫調用經理的方法來過濾對象更高層次的模塊。隨着Q objects,您可以創建,您可以使用這樣的通用過濾器:

q = Q(field__isnull = False) | Q(otherfield__isnull = False) 
objects = Model.objects.filter(q) 

編輯II:

它只是讓我吃驚:Python允許非常通用的編程。班級和職能是一流的公民。考慮下面的例子:

def HasFooBar(model_class): 
    return list(model_class.objects.filter(somefield__contains = 'foobar')) 

def BarHasBaz(model_class, arg): 
    return list(model_class.objects.filter(somefield = arg)) 

objects = HasFooBar(MyModel) + BarHasBaz(OtherModel, baz) 

你看我剛剛在那裏做了什麼? :)

+0

是的,但規範可以更抽象的查詢。例如:HasFooBar()。和()。BarHasBaz()這些是一起加入的大量查詢。 – 2010-11-28 17:16:57