2013-04-22 20 views
2

我需要查詢特定模型的一組對象,更改單個屬性/列(「帳戶」),然後將整個查詢集的對象保存爲新對象/行。換句話說,我想複製這些對象,並在重複項上更改一個屬性(「帳戶」)。我基本上是創建一個新帳戶,然後遍歷每個模型,並將以前的帳戶對象複製到新帳戶,所以我會反覆做這個,使用不同的模型,可能使用django shell。我應該如何處理這個問題?它可以在查詢集級別完成,還是需要遍歷所有對象?如何修改一個查詢集並將其保存爲新對象?

MyModel.objects.filter(account="acct_1") 
# Now I need to set account = "acct_2" for the entire queryset, 
# and save as new rows in the database 
+0

我想我很困惑。你想複製對象,並設置一個新的帳戶給他們? – bozdoz 2013-04-22 14:47:35

+0

是的。對不起,我會試着將其改寫成更清楚。 – 2013-04-22 14:48:58

+0

您可以批量更新,並且可以批量插入,但不能批量更新並在一行中創建新的。您必須遍歷查詢集。 – 2013-04-22 14:54:33

回答

1

docs

如果未設置對象的主鍵屬性,或者如果它的設置但是 記錄不存在,Django會執行一個INSERT 。

所以,如果你設置的idpk爲無它應該工作,但我已經看到了衝突的反應,此解決方案在這樣:Duplicating model instances and their related objects in Django/Algorithm for recusrively duplicating an object

這個解決方案應該工作(感謝@JoshSmeaton的修復) :

models = MyModel.objects.filter(account="acct_1") 
for model in models: 
    model.id = None 
    model.account = "acct_2" 
    model.save() 

我想在我的情況,我對我測試模型上的OneToOneField,因此它是有道理的,我的測試將不能與這Basic解決方案。但是,只要你照顧OneToOneField's,我相信它應該可以工作。

+0

但這會節省舊物件,不是嗎? – 2013-04-22 14:47:34

+0

是的。我對這個問題感到困惑。道歉@BenRoberts – bozdoz 2013-04-22 14:47:51

+0

這將覆蓋該字段。 – Ahsan 2013-04-22 14:48:04

相關問題