我希望每次用户尝试更新实例时创建一个重复的实例。现有的记录不受影响,完整的更新保存到新实例。
一些外键和反向外键也必须重复。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
时也做类似的事情。
这当然不是很通用。这是特定于这两个模型的。如果您需要更通用的东西,您可以遍历每个字段,确定它是什么类型的字段,创建所需的重复项,等等。