2017-07-06 56 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()方法。