2014-09-10 61 views
0

我一直在这里两天,我现在希望有人能指出我在正确的方向。我所要做的就是将表/模型中的条目复制到具有镜像字段的另一个模型中,实质上创建一个存档版本。我希望在用户调用更新视图时发生这种情况。在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'的方法来解决这个问题?即某种官方档案功能?

在此先感谢。

+1

有类似的问题: http://stackoverflow.com/questions/10817422/copy-model-object-from-a-model-to-another-in-django – 2014-09-10 19:57:08

+0

感谢伊戈尔,我没看到那个帖子昨天,但认为这不是我想要的。显然它是!我已经在下面发布了我的新代码。 – Karl 2014-09-11 12:27:56

回答

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, …) 

这种方式为您处理保存,因此您不需要明确地保存您的对象。

+0

感谢您的回答。在尝试我的答案中的代码之前,我尝试了上述方法。它仍然存在只能在查询集'e'中获得第一个字段的问题。 – Karl 2014-09-11 12:29:29

1

的帮助下@伊戈尔的评论我修改了我的解决方案是:

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是行不通的,因为它是听/链接到一个模型,而不是一个视图我原本以为。所以我将上面的代码放在我的更新视图中,并称它通过object_id中的id

再次感谢您的帮助。

相关问题