覆盖默认保存方法并创建副本



我希望每次用户尝试更新实例时创建一个重复的实例。现有的记录不受影响,完整的更新保存到新实例。

一些外键和反向外键也必须重复。Django文档讨论复制对象,但不讨论反向外键。

首先,有一个公认的方法来解决这个问题吗?

其次,我不确定是否最好覆盖表单保存方法或模型保存方法?我希望它适用于一切,不管形式,所以我认为它应该在模型级别应用?

模型的简化版本如下所示。

class Invoice(models.Model):
    number = models.CharField(max_length=15)
class Line(models.Model):
    invoice = models.ForeignKey(Invoice)
    price = models.DecimalField(max_digits=15, decimal_places=4)

我来试试。如果您需要在每次进行任何更改时复制它,那么覆盖模型save方法。注意,当在查询集上执行.update()时,这不会有任何影响。

class Invoice(models.Model):
    number = models.CharField(max_length=15)
    def save(self, *args, **kwargs):
        if not self.pk:
            # if we dont have a pk set yet, it is the first time we are saving. Nothing to duplicate.
            super(Invoice, self).save(*args, **kwargs)
        else:
            # save the line items before we duplicate
            lines = list(self.line_set.all())
            self.pk = None
            super(Invoice, self).save(*args, **kwargs)
            for line in lines:
                line.pk = None
                line.invoice = self
                line.save()

每次在现有记录上调用.save()时都会创建一个重复的Invoice。它还将为绑定到该Invoice的每个Line创建副本。您可能需要在每次更新Line时也做类似的事情。

这当然不是很通用。这是特定于这两个模型的。如果您需要更通用的东西,您可以遍历每个字段,确定它是什么类型的字段,创建所需的重复项,等等。

最新更新