我希望每次用户尝试更新实例时都创建一个重复的实例。现有记录不受影响,完整更新将保存到新实例。
还必须复制一些外键和反向外键。 Django文档 talks about duplicating objects,但不解决反向外键问题。
首先,是否有接受此问题的方法?
其次,我不确定是否最好覆盖表格保存方法或模型保存方法?我希望它适用于所有内容,无论其形式如何,所以我认为它应该应用于模型级别?
下面概述了模型的简化版本。
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)
答案 0 :(得分:1)
这是我的镜头。如果每次进行任何更改时都需要复制,请覆盖模型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()
每次在现有记录上调用Invoice
时,这将创建重复的.save()
。它还会为与Line
相关联的每个Invoice
创建重复项。每次更新Line
时,您可能需要执行类似的操作。
这当然不是很通用。这是针对这两种型号的。如果你需要更通用的东西,你可以遍历每个字段,确定它是什么类型的字段,做出所需的重复等等。