2010-11-30 7 views
0

私は、RESTサービスにpingを実行して結果を保存するモデルを持っています。このモデルを作成するより良い方法はありますか? (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することができ、繰り返して、すべてを実行し、把握する必要があります。

これを行うより良い方法はありますか?私は2回目を保存しようとしたときに重複エラーが発生していたので、手動でpkを設定する必要がありました。

汚れているようですが、私は自分のコーディングを改善しようとしています。 おかげで非常に悪いになります

+0

このモデルを 'Store'モデルとマージできない理由はありますか? – SingleNegationElimination

答えて

1

まず、オブジェクトの保存とステータス情報の取得を関連付けることは、非常に悪い考えです。このモデルで実行する唯一のアクションが「更新」であれば、状況を更新したら自動的に保存する「更新()」メソッドを作成する方が良いでしょうまわり。

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

第二:どのようにあなたがこのモデルの最初のインスタンスを作成していますか?モデルが更新されるたびに新しいインスタンスを保存しようとすると、重複エラーが発生します。することができます、あなたが十分に怠惰されている場合には

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

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

または:

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

あなたがやるべきことのようなものです:あなたはこのような何かを行う場合には、言いますStoreモデルに常に「update_status」メソッドを追加し、そこに作成/更新を実行します。あなたが何をしているかを明示することは、常により良いことです。覚えておいてください:Djangoは最小の驚きの原則に基づいており、あなたのコードもそうです!
1.レスポンスを受信するREST呼び出しを行い、そして
2、パラメータとしてStoreオブジェクトを受け入れる:私はあなただったら:)

1

、私は考え機能を作成しているだろう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) 
関連する問題