2011-09-18 98 views
5

這是設計問題。什麼樣的方法應該是模型類的方法?

讓我們假定我們有這種模型在Django:

class Payment(models.Model): 
    purchase = ForeignKeyField(Purchase) 
    net_price = DecimalField() 
    is_accepted = BooleanField() 

    def set_accept(self): 
    # there will be some logic, which touch purchase, send emails etc. 

    def price_with_tax(self): 
    return net_price * (1. + TAX) 

我們還呼籲另一個文件actions.py我們實現 有其他動作。 我們的問題是要確定哪種方法應該放在models.py, 其中actions.py。 你知道任何常見的方法,指導或類似的東西嗎? 我想盡可能使用現有的解決方案。

感謝

回答

6

在MVC框架(如Django的)總體約定是儘可能多的邏輯地放入您的機型。這有很多目的:

  • 它將您的邏輯綁定到您的數據(好東西)。
  • 使所有數據操作方法的代碼中的一個地方變得容易。
  • 允許您直接在模型上運行方法而不依賴視圖(使測試更簡單)。
  • 給你一個非常「乾淨」的API在你的模板中使用,例如:{{ object.price_with_tax }},而不是爲不同的行爲渲染不同的視圖。

爲您的項目佈局時,應儘量保留在你的models.py文件中的模型作品的任何代碼,並儘量避免使用actions.pyhelpers.py,除非你真的需要它。如果你確實有很多不適合放入models.py的代碼(也許你正在實現算法或其他),那麼約定就是使用helpers.py

以後還有很多東西可以讓你的應用程序層次結構保持清潔和有組織,但這是它的基本要點。

0

django中的標準方法是直接在模型中使用基於表格行的代碼,以及在管理器中使用多行或基於表格的代碼。

class MyManager(models.Manager): 
    def do_something_with_some_rows(self): 
     query = self.filter(...) 
     result = do_someting_with_this_query(query) 
     return result 

class MyModel(models.Model): 
    objects = MyManager() 

那麼你可以使用這個經理這樣

>>> result = MyModel.objects.do_something_with_some_rows() 

爲rdegges說,這使得你的API更清潔,更易於使用,而且也更容易了很多測試。

https://docs.djangoproject.com/en/dev/topics/db/managers/#managers

相關問題