我需要查询特定模型的一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,在重复项上更改了单个属性(“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
答案 0 :(得分:3)
来自docs:
如果未设置对象的主键属性,或者设置了对象,则设置了a 记录不存在,Django执行INSERT。
因此,如果您将id
或pk
设置为无,则应该可以使用,但我在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,我相信它应该有效。