Django自定义保存和更新

时间:2017-07-06 10:24:42

标签: 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对象:

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

但是,因为这不会调用自定义保存方法。方法do_something()不会被处理。有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:1)

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

使用它并在self.paid中添加自定义代码,希望有所帮助

答案 1 :(得分:1)

引自docs

  

请注意,update()方法直接转换为SQL语句。这是直接更新的批量操作。它不会在模型上运行任何save()方法,也不会发出pre_save或post_save信号(这是调用save()的结果),或者遵循auto_now字段选项。如果要保存QuerySet中的每个项目并确保在每个实例上调用save()方法,则不需要任何特殊函数来处理它。只需循环遍历它们并调用save()。

因此,您需要迭代查询集并为每个元素调用save()方法。

答案 2 :(得分: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()