如何修改查询集并将其另存为新对象?

时间:2013-04-22 14:39:36

标签: django django-queryset

我需要查询特定模型的一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,在重复项上更改了单个属性(“account”)。我基本上是创建一个新帐户,然后浏览每个模型并将以前帐户的对象复制到新帐户,所以我将使用不同的模型重复执行此操作,可能使用django shell。我该怎么做呢?可以在queryset级别完成,还是需要循环遍历所有对象?

即,

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

1 个答案:

答案 0 :(得分:3)

来自docs

  

如果未设置对象的主键属性,或者设置了对象,则设置了a   记录不存在,Django执行INSERT。

因此,如果您将idpk设置为无,则应该可以使用,但我在SO上看到对此解决方案的响应存在冲突: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,所以我的测试无法使用这个基本解决方案。但是,只要你照顾OneToOneField,我相信它应该有效。