覆盖默认保存方法并创建重复

时间:2014-03-17 16:58:15

标签: django django-models django-forms

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

还必须复制一些外键和反向外键。 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)

1 个答案:

答案 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时,您可能需要执行类似的操作。

这当然不是很通用。这是针对这两种型号的。如果你需要更通用的东西,你可以遍历每个字段,确定它是什么类型的字段,做出所需的重复等等。