Django中的复制/归档条目到另一个模型

时间:2014-09-10 19:44:56

标签: python django

我已经在这两天了,我现在希望有人可以指出我正确的方向。我所要做的就是将表/模型中的条目复制到具有镜像字段的另一个模型中,实质上是创建一个存档版本。我希望在用户调用更新视图时发生这种情况。

到目前为止,我尝试将pk设置为None,然后尝试找到将先前版本移至镜像/归档模型的方法。经过几个小时的研究,我放弃了这条道路。接下来我认为答案将取决于pre_save接收器,但我无法找到一种方法来访问模型实例,然后save访问归档模型。

@receiver(pre_save, sender=InstrumentAnnual)
def archive_calc_instance(sender, instance, **kwargs):

    stored_id = getattr(instance, 'id', None)
    e = InstrumentAnnual.objects.filter(id = stored_id)
    archive = InstrumentAnnualArchive(e.field_name, e.another_field_name...)
    archive.save()

据我所知,这应该有效但是e只包含模型中的第一个字段。

是否可以通过此代码完成我的目标或者是否有更多'Django'方法来解决这个问题?即某种官方档案功能?

提前致谢。

2 个答案:

答案 0 :(得分:1)

在@ Igor评论的帮助下,我修改了我的解决方案:

def archive_calc(self, object_id):
    annual = InstrumentAnnual.objects.get(id = object_id)
    annual_archive = InstrumentAnnualArchive()

    for field in annual._meta.fields:
        setattr(annual_archive, field.name, getattr(annual, field.name))
    annual_archive.pk = None
    annual_archive.save()

我发现使用pre_save不能正常工作,因为它正在监听/链接到模型,而不是我原先想到的视图。所以我将上面的代码放在我的更新视图中并将其调用为id中的object_id

再次感谢您的帮助。

答案 1 :(得分:0)

您应该在构造函数中使用命名参数,否则第一个参数将被解释为id,所以请尝试:

# omitted code
e = InstrumentAnnual.objects.filter(id=stored_id)
archive = InstrumentalAnnualArchive(field_name=e.field_name, another_name=e.another_field_name, …)
archive.save()

但你也可以使用Django的create函数,所以:

# omitted code
e = InstrumentAnnual.objects.filter(id=stored_id)
archive = InstrumentalAnnualArchive.objects.create(field_name=e.field_name, another_name=e.another_field_name, …)

这种方式可以为您处理保存,因此您无需显式保存对象。