2014-09-10 60 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

再次感謝您的幫助。

相關問題