我有一个模型的自定义保存方法。
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()
不会被处理。有没有办法解决这个问题?
答案 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()