2010-11-30 149 views
0

我有一個模型,可以ping一個REST服務並保存結果。有沒有更好的方法來創建這個模型? (Django)

class StoreStatus(models.Model): 
    store = models.OneToOneField(Store) 
    status = models.TextField() 

    def save(self, *args, **kwargs): 
     self.status = get_store_information(self.store.code) 
     self.pk = self.store.pk  
     super(StoreStatus, self).save(*args, **kwargs) 

我需要在視圖中重複運行,它的每一個圖我可以.save()它,因爲「STORE」對象是我的大部分意見。

有沒有更好的方法來做到這一點?我不得不手動設置PK,因爲當我嘗試保存第二次時,出現重複錯誤。

似乎有點骯髒,我試圖改善我的編碼。 謝謝

+0

是否有原因,這個模型不能與你的`Store`模型合併? – SingleNegationElimination 2010-12-01 01:07:19

回答

1

這看起來很糟糕。

首先,將狀態信息的檢索與對象的保存關聯起來是一個很糟糕的想法。如果'更新'是你將在這個模型上執行的唯一動作,那麼寫一個「update()」方法可能會更好,它會在狀態更新後自動保存,而不是以另一種方式進行周圍。

def update(self): 
    self.status = get_store_information(self.store.code) 
    self.save() 

第二:如何創建此模型的第一個實例?如果每次模型更新時嘗試保存新實例,都會出現重複錯誤。也就是說,如果你做這樣的事情:

# this will crap out 
update = Update(mystore) 
update.save() 

什麼,你應該做的是一樣的東西:

# this will work (provided we have 'update') 
mystore.status.update() 

或者:

# always retrieve the stored instance before saving  
status, created = StoreStatus.objects.get_or_create(store=mystore) 
status.update() 

如果你夠懶的,你可以總是爲您的Store模型添加一個「update_status」方法並在那裏執行創建/更新。明白你在做什麼總是更好。記住:Django基於最少驚喜的原則,所以你的代碼應該是這樣的! :)

1

如果我是你,我就已經創建了一個功能,以便:
1.接受Store對象作爲參數,
2.進行REST調用,並
3.在接收到響應然後更新StoreStatus中的狀態。

這對於實現涉及基於web的服務的體系結構所需的鬆散耦合是理想的。

此外,如果您只是想避免重複的PK錯誤,您可以檢查id以安全地循環更新並創建條件。

def save(self, *args, **kwargs): 
    if self.id: 
     # Update case 
     pass 
    else: 
     # New object 
     # Process for the new object 
     pass 

    # Save the changes 
    super(StoreStatus, self).save(*args, **kwargs) 
相關問題