2015-04-28 70 views
-1

我有兩個類似的類,一個是業務對象,另一個是Django模型。這是代碼:如何將業務對象保存到Django模型中

class Vehicle(): 
    def __init__(self, make, model, year, miles, sold_on, sale_price, purchase_price): 
     self.make = make 
     self.model = model 
     self.year = year 
     self.miles = miles 
     self.sold_on = sold_on 
     self.sale_price = sale_price 
     self.purchase_price = purchase_price 

    def __str__(self): 
     return 'Vehicle: %s %s %s %s' % (self.make, self.model, self.year, self.miles) 

    def calculate_sale_price(self): 
     if self.miles > 0 and self.miles <= 20000: 
      return 15500 
     elif self.miles > 20000 and self.miles <= 50000: 
      return 11200 
     elif self.miles > 50000 and self.miles <= 100000: 
      return 8550 
     elif self.miles > 100000 and self.miles <= 200000: 
      return 4645 
     else: 
      return 2300 

    def is_vehicle_luxury(self): 
     if self.make in ['Cadilac', 'Lexus', 'BMW']: 
      return True 
     if self.year in [2000, 2015, 1945, 1973]: 
      return True 

models.py

class Vehicle(models.Model): 
    make = models.CharField(max_length=300) 
    model = models.CharField(max_length=300) 
    year = models.IntegerField() 
    miles = models.IntegerField() 
    sold_on = models.DateTimeField(null=True, blank=True) 
    sale_price = models.FloatField(null=True, blank=True) 
    purchase_price = models.FloatField(null=True, blank=True) 

所以,問題是:應該這兩個類合併成一個?或創建另一段代碼來創建業務對象,然後從業務對象填充模型。那麼處理這個問題最好的辦法是什麼?

+0

只是爲了澄清,問題不在於如何新記錄保存到Django的模型。我已經知道如何做到這一點,問題更多的是如何避免編碼中的冗餘。 –

+0

這取決於你想要什麼真的。一般來說,如果你有一個重複,這不是一個好主意,特別是你有兩個類幾乎完全相同。 – Tanorix

+0

這是一個非常有趣的問題。無視票! –

回答

0

我無法評論,因爲我沒有足夠的代表。基本上來自模型視圖控制器ViewModel類型的環境,有人會說你應該有你的django模型類的域模型,然後有一個用於視圖的模型。

在Django中,我覺得這個設置很愚蠢,根本不能保存。如果你的視圖模型和領域模型差異很大,我只需要Django應用程序返回json數據,並讓像React或類似的客戶端框架構建你的UI。

由於Django ORM對象將與您的ViewModel對象相同,因此不需要兩個完全相同或非常相似的對象四處浮動。

0

如果您將業務對象與持久性邏輯分開,那麼您可以比運行BO和持久層的情況快上百倍的速度運行測試。

通常爲了測試django建議應該放在模型中的邏輯,總是需要訪問數據庫。這樣做會顯着降低測試速度。不幸的是,django並不是爲了讓邏輯與模型非常容易分離而建立的(因爲很多對象,比如admin和form類都依賴於Models,而不是任何更高級的實體)。很多人擁有這個問題。我們有它!我的意思是我們有1個非django項目處理一些xml處理(大量數字處理),其中100多個測試在2秒內運行......然後我們有django項目也有100多個測試運行在大約一分鐘。

你可能會嘗試中間的方式:儘可能少的邏輯在模型中儘可能人性化,並儘可能多的邏輯到services圖層......你如何實現這個是你自己決定的,雖然我不知道有人這樣做。

這裏有一個傢伙解釋爲什麼它的不理想,把你的業務邏輯模型中: http://nando.oui.com.br/2014/04/01/large_apps_with_sqlalchemy__architecture.html

相關問題