我已经在这两天了,我现在希望有人可以指出我正确的方向。我所要做的就是将表/模型中的条目复制到具有镜像字段的另一个模型中,实质上是创建一个存档版本。我希望在用户调用更新视图时发生这种情况。
到目前为止,我尝试将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'方法来解决这个问题?即某种官方档案功能?
提前致谢。
答案 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, …)
这种方式可以为您处理保存,因此您无需显式保存对象。