2

私はこの小さなモデルを持っていると仮定します:

class Deal(models.Model):
    purchases = models.IntegerField(default=0)#amount of purchases so far

    increase_purchases(self,to_add):
        self.update( purchases =self.purchases + to_add)

シェルからこの increase_purchases モデルを使用しようとすると:

>>> x = Deal.objects.get(id=1)
>>> x.increase_purchases(4)
AttributeError: 'Deal' object has no attribute 'update'

選択したクエリの購入を必要に応じて更新できるように、モデルに適切な関数を書き込むにはどうすればよいですか?

4

4 に答える 4

4

例と説明に基づいて、おそらく次のようなものが必要です。

class Deal(models.Model):        
    purchase_count = models.IntegerField(default=0)

    def purchase(self, quantity=1):
       self.purchase_count = self.purchase_count + quantity

私はイグナシオに同意します。オブジェクトを変更して保存します。したがって、シェルでは次のようになります。

> great_deal = Deal.objects.get(id=1)
> great_deal.purchase(4)
> great_deal.save()
> # or w/o an explicite argument it will record a single purchase
> # great_deal.purchase()

はい、Deal モデルの名前を少し変更しました。このようにすると、より説明的になりました。

于 2010-02-09T07:46:47.273 に答える
3

適切なフィールドを変更してsave()から、インスタンスを呼び出します。

于 2010-02-09T05:46:25.567 に答える
1

または、よりクリーンなコードの場合は+=式を使用します。

class Deal(models.Model):        
    purchase_count = models.IntegerField(default=0)

    def purchase(self, quantity=1):
       self.purchase_count += quantity
于 2010-02-09T12:44:27.720 に答える
1

Django 1.6.2 で。この動作に遭遇し、「フィルター」を使用すると、更新が期待どおりに機能します。たとえば、Students.objects.select_for_update().filter(id=3).update(score = 10) です。

参考までに: トランザクションを処理している場合を除き、save() を使用して各フィールドを個別に変更すると、マルチスレッド環境でデータの不整合が生じる可能性があります。threadA がモデルで save() を呼び出すまでに、別の threadB がモデル フィールドを変更して保存している可能性があります。その場合、threadA は更新されたモデルを読み取って変更する必要があります。

于 2015-04-06T09:35:29.850 に答える