2017-07-06 70 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自定義代碼,希望它有助於

1

報價從docs

請注意,update()方法是直接轉換爲SQL聲明。這是直接更新的批量操作。它不會在模型上運行任何save()方法,或者發出pre_save或post_save信號(這是調用save()的結果),也可以是auto_now字段選項。如果要將每個項目保存在QuerySet中並確保在每個實例上調用save()方法,則不需要任何特殊函數來處理該項目。只需循環它們並調用save()。

因此,您需要迭代queryset併爲每個元素調用save()方法。