2017-07-06 15 views
1

私はモデルのカスタム保存メソッドを持っています。ビューでDjangoのカスタム保存と更新

class Ticket(models.Model): 
    show = models.ForeignKey(Show) 
    seat = models.ForeignKey(Seat) 
    ref = models.CharField(max_length=100) 
    paid = models.BooleanField(default=False) 

    class Meta: 
     unique_together = ('show', 'seat') 

    def save(self, *args, **kwargs): 
     if self.paid: 
      do_something() 

私は、複数のチケットオブジェクトを更新したいと思います。これはメソッドの保存カスタムを呼び出すことはありませんから、

Ticket.objects.filter(ref='ref').update(paid=True) 

しかし。メソッドdo_something()は処理されません。この問題を解決する方法はありますか?

答えて

1

明白な解決策は次のようになります。

for ticket in Ticket.objects.filter(ref='ref'): 
    ticket.paid = True 
    ticket.save() 

あなたがあきらめたくないパフォーマンス上の理由からupdateを行っている場合は、あなたができる:

new_paid_tickets = Ticket.objects.filter(ref='ref') 
new_paid_tickets.update(paid=True) 
for ticket in new_paid_tickets: 
    do_something() 
1
def save(self, *args, **kwargs): 
     if self.paid: 
      do_something() 
    super(Ticket, self).save(*args, **kwargs) 

使用本とself.paid内部のカスタムコードを追加し、それはdocsから

1

引用役に立てば幸い:

はupdate()メソッドは、SQLに直接変換されることに注意してくださいステートメント。これは直接更新の一括操作です。モデル上でsave()メソッドを実行したり、pre_saveまたはpost_saveシグナル(save()の呼び出しの結果)を出力したり、auto_nowフィールドオプションを使用したりしません。 QuerySetのすべての項目を保存し、save()メソッドが各インスタンスで呼び出されていることを確認するには、その処理に特別な関数は必要ありません。ループしてsave()を呼び出してください。

したがって、クエリーセット全体を反復処理し、各要素に対してsave()メソッドを呼び出す必要があります。

関連する問題