4

我需要查询特定模型的一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,并在副本上更改单个属性(“帐户”)。我基本上是在创建一个新帐户,然后遍历每个模型并将先前帐户的对象复制到新帐户,因此我将使用不同的模型重复执行此操作,可能使用 django shell。我应该如何处理这个?可以在查询集级别完成还是我需要遍历所有对象?

IE,

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
4

1 回答 1

7

文档

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

因此,如果将idor设置pk为 None 它应该可以工作,但是我在 SO 上看到了对此解决方案的冲突响应:Duplicating model instances and their related objects in Django / Algorithm for recursively 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 的。

于 2013-04-22T14:44:35.227 回答